前序 中序 後序遍歷結果重建二叉樹

2021-10-07 09:00:30 字數 1850 閱讀 3075

源**已知一棵二叉樹的前序遍歷結果為,中序遍歷結果為為,請問這可二叉樹的後序遍歷結果是多少?

對於這樣的題目,如果真的完全了解樹的前中後序的原理,其實是不難的。

三種遍歷都是從根結點開始,前序遍歷是先列印在遞迴左和右,中序遍歷是先遞迴左,再列印,最後在遞迴右。所以前序遍歷結果為,第乙個數字1被列印出來,就說明1是根結點的資料。再由中序遍歷結果,就知道4、2、5是1的左子樹的結點,而3、6是右子樹的結點。如圖1所示。

然後我們結點1的左子樹:4、2、5;前序遍歷結果中先列印2,所以2是1的左孩子;4和5是2的子孫,且不一定都是兒子,還有可能其中乙個是孫子。由中序結果可知,在2的前面列印4,在2的後面列印5,所以可知4是2的左孩子,5是2的右孩子。如圖2所示。

同理,再看結點1的右子樹:3、6;前序遍歷結果先列印3,所以3是1的右孩子;而6只能是3的孩子,是3的左孩子還是右孩子暫不可知。由中序遍歷結果可知,先列印3再列印6,所以6是3的右孩子。如圖3所示。

已經復原了二叉樹後序遍歷結果就是。

如果題目的要求是已知二叉樹的中序遍歷結果和後序遍歷結果,求前序遍歷結果。

由後序遍歷的結果,得到1是根節點,因此前序首數字是1;

於是根據中序序列分為兩棵樹,左子樹4、2、5 和右子樹 3、6;

由後序序列的4、5、2,知道2是1的左孩子 ,4和5是2的子孫,再由中序序列可知,4是2的左孩子,5是2的右孩子。

由後序序列的6、3,知道3是1的右孩子,6是3的孩子,再有中序序列可知,6是3的右孩子。

最終便可得到前序序列。

有上述的兩道題,也可得知二叉樹的連個性質:

已知前序遍歷結果和中序遍歷結果,可以確定唯一一顆二叉樹。

已知後序遍歷結果和中序遍歷結果,可以確定唯一一顆二叉樹。

但是,已知前序遍歷結果和後序遍歷結果,是不能確定一顆二叉樹。比如:前序序列3、6和 後序序列6、3。可以確定3是根節點,但是接下來的結果可能是多種的。如圖4所示。

前序、中序遍歷結果重建二叉樹

// a code block

public node buildtree(int preorder, int inorder)

node root = new node(preorder[0]); //前序序列的第乙個值就是樹的根結點

int pos = 0;

//找到中序序列中根結點的位置,根結點左邊屬於左子樹,右邊屬於右子樹

for (int i = 0; i < len; i++)

}int preleft = arrays.copyofrange(preorder,1,pos);//左子樹的前序遍歷結果

int inleft = arrays.copyofrange(inorder,0,pos-1);//左子樹的中序遍歷結果

int preright = arrays.copyofrange(preorder,pos,len);//右子樹的前序遍歷結果

int inright = arrays.copyofrange(inorder,pos,len);//右子樹的中序遍歷結果

//遞迴

root.left = buildtree(preleft,inleft);

root.right = buildtree(preright,inright);

return root;

}

二叉樹遍歷(前序,中序,後序

二叉樹的遍歷有三種方式,如下 1 前序遍歷 dlr 首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。簡記根 左 右。2 中序遍歷 ldr 首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。簡記左 根 右。3 後序遍歷 lrd 首先遍歷左子樹,然後遍歷右子樹,最後訪問根結點。簡記左 右 根。例1 如上圖...

根據二叉樹先序中序後序遍歷結果重建二叉樹 詳細解釋

c 二叉樹的建立 前中後序遍歷 以及遇到的坑 思路 1 二叉樹的先序遍歷的第乙個結點是根節點 2 中序遍歷的根節點左邊的序列是左子樹的結點,右邊的序列是右子樹的結點 3 左子樹和右子樹分別重複步驟1 2 步驟如下 這個無法給出正確的樹結構,因為先序 根左右 和後序 左右根 遍歷的左右孩子遍歷的順序一...

根據前序和中序遍歷結果重建二叉樹

前序遍歷 根節點 左子樹 右子樹 中序遍歷 左孩子 根節點 右子樹 根據前序遍歷的特性可以得知 1.前序遍歷後的第乙個節點就是這棵樹的根節點。2.根據中序遍歷找到根節點後,其左邊的節點都是根節點的左子樹,其右邊的節點都是根節點的右子樹。3.用遞迴的方式將根節點的左子樹和右子樹分別看成是一棵樹。對於遞...