已知二叉樹的後序遍歷和中序遍歷重建二叉樹 二叉樹

2021-07-26 11:23:50 字數 1667 閱讀 3990

由中序遍歷和後序遍歷重建二叉樹

中序遍歷中,根節點總是位於左右子樹中間,將左右子樹分開。

後序遍歷中,根節點總是在左右子樹之後。

重建演算法:

現在說一下重建根節點的過程,其他節點可以遞迴建立。

由後序遍歷定義可知,後序遍歷序列的最後乙個元素必定是整個樹的根節點,這樣就確定了根節點。

由中序遍歷定義可知,在中序遍歷中查詢根節點,可以確定根節點在中序遍歷序列中位置,這樣就可以將中序遍歷序列分為左右子樹,一旦確定左右子樹,左右子樹的長度也就確定了,根據左右子樹的長度,在後序遍歷序列中,可以確定左右子樹的根節點,這樣遞迴下去既可以確定整個樹。

# -*- 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...