1. 程式人生 > >通過兩種深度優先遍歷方式重建二叉樹或者得到其余一種遍歷方式

通過兩種深度優先遍歷方式重建二叉樹或者得到其余一種遍歷方式

strong 節點 public node binary right 方法 二叉 sta

  重建二叉樹的方法有很多種,但是並不是通過任意兩種深度優先遍歷方式都可以重建二叉樹,它也是有限制的。

  通過前序+中序、後序+中序、層序+中序這三種方式是可以重建二叉樹的,但是通過前序+後序、前序+層序、後序+層序這三種方式是不能重建二叉樹的。本文重點講解通過前序+中序的方式重建二叉樹的基本思想以及具體的代碼實現。

基本思想

  中序遍歷的第一個節點是root節點,在前序遍歷中找到root, root的前半段就是root的左子樹的前序遍歷(長度M), root的後半段就是root的右子樹的前序遍歷(長度N),因此在前序遍歷種,root之後長度M的序列是root的左子樹的中序遍歷,再後面N個就是root右子樹的中序遍歷,重復上述過程即可。

代碼實現

 1 /**
 2  * 二叉樹節點的定義
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 public class reConstruct{
11     public TreeNode reConstructBinaryTree(int [] pre, int [] in){
12         TreeNode treeNode = reConstruct(pre,0,pre.length-1,in,0,in.length-1);
13 return treeNode; 14 } 15 16 private TreeNode reConstruct(int[] pre,int startPre,int endPre,int[] in,int startIn,int endIn){ 17 if(startPre>endPre || startIn>endIn){ 18 return null; 19 } 20 TreeNode treeNode = new TreeNode(pre[startPre]); 21
for(int i=startIn;i<=endIn;i++){ 22 if(in[i]==pre[startPre]){ 23 treeNode.left = reConstruct(pre,startPre+1,startPre+i-startIn,in,startIn,i-1); 24 treeNode.right = reConstruct(pre,startPre+i-startIn+1,endPre,in,i+1,endIn); 25 break; 26 } 27 } 28 return treeNode; 29 } 30 }

通過兩種深度優先遍歷方式重建二叉樹或者得到其余一種遍歷方式