劍指offer系列26之二叉搜尋樹與雙向鍊錶

2021-09-12 01:14:20 字數 2606 閱讀 2826

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

思路一:非遞迴法

非遞迴法主要利用了二叉樹的中序遍歷的非遞迴方法。

python實現

# -*- coding:utf-8 -*-

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

:def

convert

(self, prootoftree)

:# write code here

if prootoftree ==

none

:return

none

stack =

p = prootoftree

pre =

none

first_flag =

1while p or

len(stack)

>0:

while p:

p = p.left

p = stack[-1

] stack.pop(

)if first_flag:

prootoftree = p

pre = prootoftree

first_flag =

0else

: pre.right = p

p.left = pre

pre = p

p = p.right

return prootoftree

c++實現
/*

struct treenode

};*/

class solution

p = stack.

back()

; stack.

pop_back()

;if(first)

else

p = p->right;

}return prootoftree;}}

;

思路二:遞迴法

python實現

# -*- coding:utf-8 -*-

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

: head =

none

p =none

defconvert

(self, prootoftree)

:# write code here

ifnot prootoftree:

return

none

self.subconvert(prootoftree)

return self.head

defsubconvert

(self, prootoftree)

:if prootoftree ==

none

:return

self.subconvert(prootoftree.left)

ifnot self.head:

self.head = prootoftree

self.p = self.head

else

: self.p.right = prootoftree

prootoftree.left = self.p

self.p = prootoftree

self.subconvert(prootoftree.right)

c++實現
/*

struct treenode

};*/

class solution

void

subconvert

(treenode* prootoftree)

else

subconvert

(prootoftree->right);}

};

下面這種方法建立了新節點,不滿足條件。

c++實現

/*

struct treenode

};*/

class solution

};

c++實現
/*

struct treenode

};*/

class solution

treenode*

convert

(treenode* prootoftree)

return v[0]

;}};

劍指offer之二叉樹總結

會用遞迴了二叉樹的問題就會一大半了.一.用遞迴求解 對於要利用二叉樹的規律的題都可以利用它的左節點也是其左子樹的根節點的特性來遞迴求解。可以說那種引數有根節點的題一般都可以用遞迴來解決,來看看 劍指offer 中可用遞迴解決的題 1.根據前序遍歷的性質,第乙個元素必然就是root,那麼下面的工作就是...

劍指offer系列18之二叉樹的映象

操作給定的二叉樹,將其變換為源二叉樹的映象。輸入描述 思路一 遞迴 遞迴的思路主要是利用了二叉樹的前序遍歷。python實現 coding utf 8 class treenode def init self,x self.val x self.left none self.right none c...

2 6 劍指offer 對稱的二叉樹

請實現乙個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果乙個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。兩個樹a和b對稱等價於 這兩個根節點上儲存的值相等 a的左子樹節點和b的右子樹上的節點是對稱的 a的右子樹節點和b的左子樹上的節點是對稱的 實現時,可以通過設定兩個指標同時遍歷二叉樹,遞迴實...