前序+中序,中序+後序均可以構造出原本的樹結構;前序加後序無法構造唯一的樹結構。
假設節點是這樣的:
class treenode:
def __init__(self, x):
self.val = x
self.left = none
self.right = none
假設樹是這樣的:
root=treenode(1)
root_1_1=treenode(2)
root_1_2=treenode(3)
root_1_1_1=treenode(4)
root_1_1_2=treenode(5)
root_1_2_1=treenode(6)
root.left=root_1_1
root.right=root_1_2
root_1_1.left=root_1_1_1
root_1_1.right=root_1_1_2
root_1_2.left=root_1_2_1
那麼,現在寫出前序和中序表達,使用以下函式,能得出正確的樹結構;之後用後序的方式列印:
pre=[1,2,4,5,3,6]
post=[4,2,5,1,6,3]
root_pre_tin = s.reconstructbinarytree_pre_tin(pre,post)
my_print_post(root_pre_tin)
桶同理,現在寫出中序和後序表達,使用以下函式,能得出正確的樹結構;之後用前序的方式列印:
tin=[4,2,5,1,6,3]
post=[4,5,2,6,3,1]
root_tin_post = s.reconstructbinarytree_tin_post(tin,post,0,len(tin)-1,0,len(post)-1)
my_print_pre(root_tin_post)
sollution類定義如下:
class solution:
# 返回構造的treenode根節點
def reconstructbinarytree_pre_tin(self, pre, tin):
# write code here
if not pre or not tin:
return none
else:
root=treenode(pre.pop(0))
index=tin.index(root.val)
# print("root",root.val)
# print("left",pre,tin[0:index])
# print("right",pre,tin[1+index:])
root.left=self.reconstructbinarytree_pre_tin(pre,tin[0:index])
root.right=self.reconstructbinarytree_pre_tin(pre,tin[index+1:])
return root
def reconstructbinarytree_tin_post(self, tin,post,tin_s,tin_end,post_s,post_e):
# write code here
root = treenode(post[post_e])
if post_s==post_e:
return root
index=tin.index(root.val)
if index-1>=tin_s:
root.left=self.reconstructbinarytree_tin_post(tin,post,tin_s,index-1,post_s,post_s+index-1-tin_s)
if index+1<=tin_end:
root.right=self.reconstructbinarytree_tin_post(tin,post,index+1,tin_end,post_s+index-tin_s,post_e-1)
return root
自定義列印方式如下:
def my_print_pre(root):
if root:
print("當前節點:",root.val)
if root.left:
print(root.val,"的左節點")
my_print_pre(root.left)
if root.right:
print(root.val,"的右節點")
my_print_pre(root.right)
def my_print_post(root):
if root.left:
my_print_post(root.left)
if root.right:
my_print_post(root.right)
if root:
print(root.val)
二叉樹重構
問題描述 根據前序遍歷結果和中序遍歷結果,重構二叉樹。1 前序遍歷結果的特點 假設當前的遍歷結果是完整的樹節點集合。那麼第乙個節點就是該樹的根節點,並且其後面的節點集合中,前半部分是其左子樹的節點集合,後半部分是其右子樹的節點集合。2 中序遍歷結果的特點 如果當前節點是當前樹的根節點,那麼該節點左邊...
重構二叉樹
重構二叉樹的思路主要是首先在前序 後序 序列中找到根結點,然後在中序序列中找到根結點所在的位置,該結點將整個序列分成兩個部分,前一部分為根結點的左子樹元素,後一部分為根結點的右子樹元素。再遞迴的生成左子樹和右子樹即可。1.通過前序,中序序列重構二叉樹 treenode buildtree vecto...
二叉樹重構
先驗知識 前序 第乙個數就是根節點 中序 根節點位於中間,剛好將其左右子樹分開 運用方法 遞迴 找到根節點,將其數值放入value,遞迴的分別根據左右子樹進行二叉樹重建 根據函式已有的介面,因此,需要將左 右 子樹的前序,中序分別用vector進行賦值 最後遞迴的對左右進行重建,方法一樣 關鍵 易錯...