在二叉树中给出二叉树的前序及中序遍历,求出他的整个二叉树。
例:
前序遍历:pre:ABDECFG
中序遍历:in:DEBAFGC
思路:
首先明确一下他们的遍历顺序:
前序遍历:根节点->左子树->右子树
中序遍历:左子树->右子树->根节点、
前序遍历是从根节点开始的所以pre的第一个节点肯定是当前树的根节点
而根据中序遍历的in数组可以得到根节点的左右子树。
分别用i,j表示前序遍历中当前子树的范围,用k,l表示中序便利中当前子树的范围。
首先针对这个二叉树i=k=0,j=l=6;
pre[i]为当前子树的根节点怕pre[i]在in中的位置是3用index表示。
index-k为左子树的长度。
l-index+1为右子树的长度。
所以在pre中i之后(index-k)的长度的节点属于左子树,再之后的属于右子树。
在in中下标为k到index-1之间的节点属于左子树index+1到l的节点属于右子树。
根据这种规律运用递归可以很方便的求出整个二叉树。
下面为求出的二叉树:
java代码实现如下:
import java.util.HashMap;
public class demo1 {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre==null||in==null) {
return null;
}
HashMap<Integer, Integer> map=new HashMap<Integer, Integer>();
for(int i=0;i<in.length;i++) {
map.put(in[i], i);
}
return preIn(pre, 0, pre.length-1, in,0,in.length-1,map);
}
private TreeNode preIn(int[] pre, int i, int j, int[] in, int k, int l, HashMap<Integer, Integer> map) {
// TODO Auto-generated method stub
if(i>j) return null;
TreeNode head=new TreeNode(pre[i]);//第i个节点肯定为当前树的根节点
int index=map.get(pre[i]);//在中序遍历中找到当前根节点位置,根节点前的肯定是当前节点左子树的节点,后面的肯定为右子树的节点
head.left=preIn(pre,i+1,i+index-k,in,k,index-1,map);//index-k为左子树的长度在in数组中,k到index-1都属于左子树
head.right=preIn(pre,i+index-k+1,j,in,index+1,l,map);
return head;
}
}
class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int x) {
this.val=x;
// TODO Auto-generated constructor stub
}
}