定義二叉樹:
classtreenode:
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.遞迴版本:
defpre_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:
(node.val)
if node.right is
notnone:
if node.left is
notnone:
node = stack.pop()
中序遍歷:
1.遞迴版本
defin_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()
(pos.val)
pos = pos.right
後序遍歷:
1.遞迴版本
defpost_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 二叉樹 要求給出中序遍歷的結果。下面分別就前序遍歷 中序遍歷 後序遍歷進行分析。規律 前序遍歷 根在前 子樹在根後且左子樹比右子樹靠前 中序遍歷 根在中 左子樹在根左邊,右子樹在根右邊 後序遍歷 根在後 子樹在根前且左子樹比...