python重構二叉樹

2021-09-16 22:31:21 字數 2570 閱讀 8686

前序+中序,中序+後序均可以構造出原本的樹結構;前序加後序無法構造唯一的樹結構。

假設節點是這樣的:

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進行賦值 最後遞迴的對左右進行重建,方法一樣 關鍵 易錯...