二叉樹的前中後序 層序遍歷以及重建

2021-10-09 17:19:57 字數 3234 閱讀 1796

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 中序遍歷是實際問題中經常使用的一種遍歷。其 形式與前序遍歷很相似,其遍歷順序為 左子樹 根 右子樹...