題目描述
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
普通的二叉樹也可以轉換成雙向鍊錶,只不過不是排序的
思路:與中序遍歷相同
採用遞迴,先鏈結左指標,再鏈結右指標
**1,更改doublelinkedlist,最後返回list的第乙個元素:
class
treenode
:def
__init__
(self, x)
: self.val = x
self.left =
none
self.right =
none
class
solution
:def
lastelem
(self,
list):
iflen
(list)==
0:return
none
else
:return
list
[len
(list)-
1]defconvertcore
(self, proot, doublelinkedlist)
:if proot:
if proot.left:
self.convertcore(proot.left, doublelinkedlist)
proot.left = self.lastelem(doublelinkedlist)
if self.lastelem(doublelinkedlist)
: self.lastelem(doublelinkedlist)
.right = proot
if proot.right:
self.convertcore(proot.right, doublelinkedlist)
defconvert
(self, prootoftree)
:if prootoftree ==
none
:return
none
doublelinkedlist =
self.convertcore(prootoftree, doublelinkedlist)
return doublelinkedlist[
0]
**2,lastlistnode指向雙向鍊錶中的最後乙個節點,因此每次操作最後乙個節點。這裡要更改值,因此採用list的形式。
class
treenode
:def
__init__
(self, x)
: self.val = x
self.left =
none
self.right =
none
class
solution
:def
convertcore
(self, proot, lastlistnode)
:if proot:
if proot.left:
self.convertcore(proot.left, lastlistnode)
proot.left = lastlistnode[0]
if lastlistnode[0]
: lastlistnode[0]
.right = proot
lastlistnode[0]
= proot
if proot.right:
self.convertcore(proot.right, lastlistnode)
defconvert
(self, prootoftree)
:# write code here
if prootoftree ==
none
:return
none
lastlistnode =
[none
] self.convertcore(prootoftree, lastlistnode)
while lastlistnode[0]
.left:
lastlistnode[0]
= lastlistnode[0]
.left
return lastlistnode[
0]
《劍指offer》 二叉搜尋樹與雙向鍊錶
題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。解法 主要應用到二叉樹的中序遍歷。將左子樹遍歷進行不斷壓棧,然後再出棧。用兩個指標,current指向當前的樹的節點,pre指向前乙個節點,然後進行改指標引用,把壓棧的節點進行...
《劍指offer》二叉搜尋樹與雙向鍊錶
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向 輸入一棵二叉搜尋樹 將該二叉搜尋樹轉換成乙個排序的雙向鍊錶 struct treenode class solution 按照中序遍歷,按照左子樹 根節點 右子樹的順序。include ...
劍指Offer 二叉搜尋樹與雙向鍊錶
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。struct treenode class solution if prootoftree right treenode head find head while head left r...