劍指offer 22 23 24二叉樹

2021-10-08 19:58:05 字數 3771 閱讀 7567

實際就是廣度優先搜尋 bfs, 借助乙個佇列就可以實現

對於一顆二叉樹,深度優先搜尋(depth first search)是沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。以上面二叉樹為例,深度優先搜尋的順序為:abdecfg。怎麼實現這個順序呢 ?深度優先搜尋二叉樹是先訪問根結點,然後遍歷左子樹接著是遍歷右子樹,因此我們可以利用堆疊的先進後出的特點,

現將右子樹壓棧,再將左子樹壓棧,這樣左子樹就位於棧頂,可以保證結點的左子樹先與右子樹被遍歷。

廣度優先搜尋(breadth first search),又叫寬度優先搜尋或橫向優先搜尋,是從根結點開始沿著樹的寬度搜尋遍歷,上面二叉樹的遍歷順序為:abcdefg.

可以利用佇列實現廣度優先搜尋。

這道題就是乙個模板題,對佇列的使用。因為要滿足先進先出的特性。

初始化:乙個佇列queue, 將root節點入佇列q

如果佇列不空,做如下操作:

彈出佇列頭,儲存為node,將node的左右非空孩子加入佇列

做2,3步驟,知道隊列為空

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

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

:# 返回從上到下每個節點值列表,例:[1,2,3]

defprintfromtoptobottom

(self, root)

:# write code here

ifnot root:

return

''//乙個佇列queue,

queue =

result =

//將root節點入佇列q

while

len(queue)

>0:

//彈出佇列頭儲存為node,將node的左右非空孩子加入佇列

node = queue.pop(0)

if node.left:

if node.right:

return result

python:後序遍歷 的序列中,最後乙個數字是樹的根節點 ,陣列中前面的數字可以分為兩部分:第一部分是左子樹節點 的值,都比根節點的值小;第二部分 是右子樹 節點的值,都比 根 節點 的值大,後面用遞迴分別判斷前後兩部分 是否 符合以上原則bst的後序序列的合法序列是,對於乙個序列s,最後乙個元素是x (也就是根),如果去掉最後乙個元素的序列為t,那麼t滿足:t可以分成兩段,前一段(左子樹)小於x,後一段(右子樹)大於x,且這兩段(子樹)都是合法的後序序列。完美的遞迴定義 。思路:已知條件:後序序列最後乙個值為root;二叉搜尋樹左子樹值都比root小,右子樹值都比root大。

1、確定root;

2、遍歷序列(除去root結點),找到第乙個大於root的位置,則該位置左邊為左子樹,右邊為右子樹;

3、遍歷右子樹,若發現有小於root的值,則直接返回false;

4、分別判斷左子樹和右子樹是否仍是二叉搜尋樹(即遞迴步驟1、2、3)。

# 序列為空,返回 false

ifnot sequence:

return

false

# 獲取序列的長度和二叉搜尋樹的根節點

length =

len(sequence)

root = sequence[-1

]# 尋找二叉搜尋樹的左子樹

for i in

range

(length)

:if sequence[i]

>root:

break

# 判斷二叉樹右子樹中的每乙個元素的值是否都比根節點的大

for j in

range

(i,length)

:if sequence[j]

return

false

# 遞迴呼叫,分別檢視二叉樹的左右子樹

left = right =

true

if i >0:

left = self.verifysquenceofbst(sequence[

0: i]

)if i < length-

1and left:

right = self.verifysquenceofbst(sequence[i:-1

])# 當左右兩子樹都返回 true 的時候,結果才是 true

:# 返回二維列表,內部每個列表表示找到的路徑

deffindpath

(self, root, expectnumber)

:# write code here

res =

path =

if root is

none

:return res

defdfs(proot)

:if proot.left is

none

and proot.right is

none:if

sum(path)

== expectnumber:

# python的好處:]

)if proot.left is

notnone

: left = dfs(proot.left)

if proot.right is

notnone

: right = dfs(proot.right)

path.pop(

) dfs(root)

res.sort(

)# python的好處

return res

重建二叉數 劍指offer

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。二叉樹四種基本的遍歷思想為 前序遍歷 根結點 左子樹 右子樹 中序遍歷 左子樹 根結點 右子樹 後序遍歷 左子樹 右子樹 根結點 層...

劍指offer 平衡二叉樹

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹 1 重複遍歷結點 參考上一題求二叉樹的深度,先求出根結點的左右子樹的深度,然後判斷它們的深度相差不超過1,如果否,則不是一棵二叉樹 如果是,再用同樣的方法分別判斷左子樹和右子樹是否為平衡二叉樹,如果都是,則這就是一棵平衡二叉樹。但上面的方法在判斷子樹是否...

劍指offer 重建二叉樹

重建二叉樹2.cpp 定義控制台應用程式的入口點。題目描述 輸入乙個二叉樹的前序遍歷和中序遍歷,輸出這顆二叉樹 思路 前序遍歷的第乙個節點一定是這個二叉樹的根節點,這個節點將二叉樹分為左右子樹兩個部分,然後進行遞迴求解 include stdafx.h include vector using na...