通過兩種深度優先遍歷方式重建二叉樹或者得到其余一種遍歷方式
阿新 • • 發佈:2018-05-19
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]); 21for(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 }
通過兩種深度優先遍歷方式重建二叉樹或者得到其余一種遍歷方式