题目描述
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
我的题解:递归
前序拿到根节点,在中序中找到该节点左边的元素和右边的元素,递归下去.
public class Offer_07 {
private int [] preorder;
private Map<Integer,Integer> map;//用于记录中序中节点对应的索引。
private int preIndex=0; //前序数组中从头开始遍历
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.preorder = preorder;
map = new HashMap<>();
for (int i=0;i<inorder.length;i++)map.put(inorder[i],i);
return cur(0,preorder.length);
}
private TreeNode cur(int inorderBegin,int inorderEnd){
if (preIndex>=preorder.length)return null;
int rootVal = preorder[preIndex];
System.out.println("preorder[ "+preIndex+" ]:"+rootVal+",子元素:[ " +inorderBegin+" , "+inorderEnd+" ]");
TreeNode root = new TreeNode(rootVal);
if (inorderBegin+1>=inorderEnd)return root;
int index = map.get(rootVal);
if (index==inorderBegin){
preIndex++;
root.right = cur(inorderBegin+1,inorderEnd);
}
else if (index==inorderEnd-1){
preIndex++;
root.left = cur(inorderBegin,inorderEnd-1);
}
else{
preIndex++;
root.left = cur(inorderBegin, index);
preIndex++;
root.right = cur(index+1,inorderEnd);
}
return root;
}
}