python遍歷二叉樹

2022-09-11 19:42:12 字數 3833 閱讀 1192

定義二叉樹:

class

treenode:

def__init__

(self, x):

self.val =x

self.left =none

self.right = none

構建二叉樹:

#

返回構造的treenode根節點

defreconstructbinarytree(self, pre, tin):

ifnot pre or

nottin:

return

none

root = treenode(pre[0])#

根節點#

判斷輸入的兩個序列是不是匹配

if set(pre) !=set(tin):

return

none

i = tin.index(root.val) #

i == 3

root.left = self.reconstructbinarytree(pre[1:i+1],tin[:i]) #

列表:左閉右開

root.right = self.reconstructbinarytree(pre[i+1:],tin[i+1:])

return root

bfs:

def bfs(self, root):   #

寬度優先遍歷bfs

array =

result =

if root ==none:

return

result

while

array:

newnode = array.pop(0) #

根結點

if newnode.left !=none:

if newnode.right !=none:

return result

先序遍歷:

1.遞迴版本:

def

pre_tr**ersal(self):

ret =

deftr**ersal(head):

ifnot

head:

return

tr**ersal(head.left)

tr**ersal(head.right)

tr**ersal(self.root)

return ret

2.非遞迴版本

#

先序列印二叉樹(非遞迴)

defpreordertr**ese(node):

stack =[node]

while len(stack) >0:

print

(node.val)

if node.right is

notnone:

if node.left is

notnone:

node = stack.pop()

中序遍歷:

1.遞迴版本

def

in_tr**ersal(self):

ret =

deftr**ersal(head):

ifnot

head:

return

tr**ersal(head.left)

tr**ersal(head.right)

tr**ersal(self.root)

return ret

2.非遞迴版本

#

中序列印二叉樹(非遞迴)

definordertr**erse(node):

stack =

pos =node

while pos is

not none or len(stack) >0:

if pos is

notnone:

pos =pos.left

else

: pos =stack.pop()

print

(pos.val)

pos = pos.right

後序遍歷:

1.遞迴版本

def

post_tr**ersal(self):

ret =

deftr**ersal(head):

ifnot

head:

return

tr**ersal(head.left)

tr**ersal(head.right)

tr**ersal(self.root)

return ret

2.非遞迴版本

#

後序列印二叉樹(非遞迴)

#使用兩個棧結構

#第乙個棧進棧順序:左節點->右節點->跟節點(?應該是根-左-右?根結點先進棧再出棧,然後左右子節點入棧?)

#第乙個棧彈出順序: 跟節點->右節點->左節點(先序遍歷棧彈出順序:跟->左->右)

#第二個棧儲存為第乙個棧的每個彈出依次進棧

#最後第二個棧依次出棧

defpostordertr**erse(node):

stack =[node]

stack2 =

while len(stack) >0:

node =stack.pop()

if node.left is

notnone:

if node.right is

notnone:

while len(stack2) >0:

print(stack2.pop().val)

求二叉樹最大深度:

#

二叉樹的最大深度

def btreedepth(node):

if node is none:

return 0

print '當前節點',node.data

ldepth = btreedepth(node.left)

print ' 節點', node.data,'的左側深度',ldepth

rdepth = btreedepth(node.right)

print ' 節點', node.data,'的右側深度',rdepth

return max(ldepth, rdepth) + 1

求二叉樹節點個數:

#

求二叉樹節點個數

def treenodenums(node):

if node is none:

return 0

print "當前節點",node.data

nums = treenodenums(node.left)

print ' ', node.data, '的左節點數', nums

right = treenodenums(node.right)

print ' ', node.data, '的右節點數', right

nums = nums + right

print ' ', node.data, '的左右節點總數', nums

return nums + 1 # 返回上一級加上父節點

構建二叉樹 遍歷二叉樹

陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...

二叉樹遍歷

二叉樹的遍歷非常重要,但對已一棵比較複雜的樹,要寫出它的先 中 後序遍歷,往往不是那麼簡單,也很容易犯錯。這裡介紹一種比較直觀且不容易犯錯的方法。對於圖1所示的二叉樹,要寫出它的先 中 後序遍歷,往往很容易出錯。圖 1 其實,我們可以用圖2中的紅線描畫出二叉樹的輪廓。圖 2 而對於樹上的每乙個節點,...

二叉樹遍歷

描述 華為實習生招聘,有一道類似如下的題目 給出二叉樹,如圖1所示 圖 1 二叉樹 要求給出中序遍歷的結果。下面分別就前序遍歷 中序遍歷 後序遍歷進行分析。規律 前序遍歷 根在前 子樹在根後且左子樹比右子樹靠前 中序遍歷 根在中 左子樹在根左邊,右子樹在根右邊 後序遍歷 根在後 子樹在根前且左子樹比...