由中序遍歷和後序遍歷重建二叉樹
中序遍歷中,根節點總是位於左右子樹中間,將左右子樹分開。
後序遍歷中,根節點總是在左右子樹之後。
重建演算法:
現在說一下重建根節點的過程,其他節點可以遞迴建立。
由後序遍歷定義可知,後序遍歷序列的最後乙個元素必定是整個樹的根節點,這樣就確定了根節點。
由中序遍歷定義可知,在中序遍歷中查詢根節點,可以確定根節點在中序遍歷序列中位置,這樣就可以將中序遍歷序列分為左右子樹,一旦確定左右子樹,左右子樹的長度也就確定了,根據左右子樹的長度,在後序遍歷序列中,可以確定左右子樹的根節點,這樣遞迴下去既可以確定整個樹。
# -*- coding:utf-8 -*-
class treenode:
def __init__(self, x):
self.val = x
self.left = none
self.right = none
class solution:
# 返回構造的treenode根節點
def reconstructbinarytree(self, post, tin):
# write code here
if len(post) == 0 or len(tin) == 0:
return none
root = treenode(post[-1])
# 獲取根節點在中序遍歷中的位置
i = tin.index(post[-1])
"""注意下面四個引數,可以根據測試樣例推導出來
i為根節點
post[0 : i]
i結點前面的是左子樹的結點所以引數如上
tin[0 : i]
同上,i結點前面的為左子樹,可以觀察測試資料
post[i : -1]
根節點在最後一位,右子樹的結點為從i開始到-1,不包括最後乙個結點
tin[i + 1 : ]
中序遍歷中i結點為根節點,i結點後面的為右子樹的結點
"""# 遍歷左子樹
root.left = self.reconstructbinarytree(post[0 : i], tin[0 : i])
# 遍歷右子樹
root.right = self.reconstructbinarytree(post[i : -1], tin[i + 1 : ])
return root
if __name__ == "__main__":
a = solution()
post_order = [7, 4, 2, 5, 8, 6, 3, 1] # 後序遍歷
mid_order = [4, 7, 2, 1, 5, 3, 8, 6] # 中序遍歷
root = a.reconstructbinarytree(post_order, mid_order)
print root.val
print root.left.val
print root.right.val
print root.left.left.val
print root.left.left.right.val
print root.right.right.left.val
print root.right.left.val
已知後序遍歷和中序遍歷求二叉樹
輸入某二叉樹的後序遍歷和中序遍歷的結果,請輸出前序遍歷序列。假設輸入的後序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入後序遍歷序列和中序遍歷序列,重建二叉樹並返回後序遍歷序列 輸入某二叉樹的後序遍歷和中序遍歷的結果 輸出前序遍歷序列 7 4 2 5 8 6 3 1 4 7 2 1 5 3 8 6...
二叉樹已知先序遍歷和中序遍歷得到後序遍歷
已經乙個二叉樹先序遍歷acdefhgb,中序遍歷decahfbg,求後序遍歷?先序遍歷 1 訪問根節點 2 先序遍歷左子樹 3 先序遍歷右子樹 中序遍歷 1 中序遍歷左子樹 2 訪問根節點 3 中序遍歷右子樹 後序遍歷 1 後序遍歷左子樹 2 後序遍歷右子樹 3 訪問根節點 解題思路 首先看先序遍歷...
已知二叉樹先序遍歷中序遍歷求後序遍歷
思路簡介 先序遍歷中第乙個字母即為根節點,在中序遍歷中找到根節點的位置 把中序遍歷的字串序列從根節點分成兩部分,左側一部分構建左子樹,右側一部分構建右子樹 在 的基礎上在先序遍歷中也找到構建左右子樹的部分 遞迴還原二叉樹 後序遍歷輸出即可 include include using namespac...