實際就是廣度優先搜尋 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...