class
treenode
:def
__init__
(self, x)
: self.val = x
self.left =
none
self.right =
none
根->左->右,前中後都是指的是根,左右的關係永遠是先左後右
1、遞迴方法
這個是通用寫法,對於中序和後序,僅需稍微調整一下(詳情看後面)
def
preord_recur
(root)
: res =
defhelper
(node):if
not node:
return
helper(node.left)
helper(node.right)
helper(root)
return res
2、非遞迴
2.1、方法一(不推薦,因為不易擴充套件到中後序)
優點:思想和遞迴的完全一致,只是翻譯了一下,比較容易想到
def
preord_inter_one
(root)
: res =
ifnot root:
return res
stack =
[root]
while stack:
node = stack.pop(
)return res
2.2 、方法二(推薦,記住乙個就可以輕易擴充套件到中後序)
這個思想也比較直觀,按照根左右的順序來即可
def
preord_inter
(root)
: res, stack =
,[]while root or stack:
while root:
root = root.left
root = stack.pop(
) root = root.right
return res
1、遞迴def
inord_recur
(root)
: res =
defhelper
(node):if
not node:
return
helper(node.left)
helper(node.right)
helper(root)
return res
2、非遞迴def
inord_inter
(root)
: res, stack =
,[]while root or stack:
while root:
root = root.left
root = stack.pop(
) root = root.right
return res
1、遞迴def
postord_recur
(root)
: res =
defhelper
(node):if
not node:
return
helper(node.left)
helper(node.right)
helper(root)
return res
2、非遞迴
核心思想:將左->右->根換成根->右->左來求解(即轉化成前序遍歷來求)
def
postord_inter
(root)
: res, stack =
,[]while root or stack:
while root:
root = root.right
root = stack.pop(
) root = root.left
return res[::
-1]
1、遞迴
加入depth,用前序遍歷的方法加入結果中
def
levelord_recur
(root)
: res =
defhelper
(node, depth):if
not node:
return
iflen
(res)
== depth:
) res[depth]
helper(node.left, depth+1)
helper(node.right, depth+1)
helper(root,0)
return res
2、非遞迴
用棧的思想來做
def
levelord_inter
(root)
: res =
ifnot root:
return res
stack =
[root]
while stack:
tmp =
next_level =
for node in stack:
stack = next_level
return res
1、前序和中序重建二叉樹def
bulid_tree
(pre_ord, in_ord):if
not pre_ord:
return
none
root = treenode(pre_ord[0]
) mid = in_ord.index(pre_ord[0]
) root.left = bulid_tree(pre_ord[
1:mid+1]
, in_ord[
:mid]
) root.right = bulid_tree(pre_ord[mid+1:
], in_ord[mid+1:
])return root
二叉樹的遍歷(前,中,後,層序)
二叉樹的遍歷是指從根節點出發,按照某種次序依次訪問二叉樹中所有節點,使得每個節點僅被訪問一次 前序遍歷 若二叉樹為空,則空操作返回,否則先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹。結果是 abdghceif 中序遍歷 若樹為空,則空操作返回,否則從根節點開始 注意並不是先訪問根節點 中序遍歷...
二叉樹的建立,前序,中序,後序,層序遍歷
二叉樹 binary tree 是另一種樹形結構,它的特點是每個節點至多有兩顆子樹,並且其子樹有左右之分,並且順序不能顛倒。主要用遞迴的思想完成建立,遍歷等操作。binarytree const t arr,const t invalied 傳入乙個順序為前序的陣列,invalied意味節點為nul...
二叉樹的遞迴遍歷 (前序,中序,後序,層序)
首先我們來講前序遍歷。前序遍歷很簡單,首先判斷根樹是否為空 注意前序遍歷的次序是 根 左子樹 右子樹 如此遞迴呼叫。以下為 templatevoid bitree preorder binode bt 中序遍歷是實際問題中經常使用的一種遍歷。其 形式與前序遍歷很相似,其遍歷順序為 左子樹 根 右子樹...