题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。1
- 分析: 采用递归
- 确定父节点,前序遍历的第一个值,就是父节点值
- 通过中序遍历,确定父节点的左子树的个数,从而可确定左子树的中序遍历和前序遍历 以及 右子树的中序遍历和前序遍历 ,调用递归即可;
- base case:
- 前序遍历为空时,返回null,
- 前序遍历只有一个元素val,返回 new TreeNode(val)
- 代码:
private int[] pre;
private int[] in;
public TreeNode buildTree(int[] preorder, int[] inorder) {
pre = preorder;
in = inorder;
HashMap<Integer,Integer> map = new HashMap<>();//(节点值,,节点索引值)
for(int i = 0;i < inorder.length;i++){
map.put(inorder[i],i);
}
return build(0,pre.length,0,in.length,map);
}
//preS:前序遍历数组起始索引,preE:前序遍历数组长度+1
//inS:中序遍历数组起始索引,inE:前序遍历数组长度+1
public TreeNode build(int preS,int preE,int inS,int inE,HashMap<Integer,Integer> map){
if(preS >= preE) return null;
if(preS == preE-1) return new TreeNode(pre[preS]);
//找父节点
int index = map.get(pre[preS]);
int len = index - inS;//求出左子树上的节点数,进而求出左子树的前序遍历
TreeNode root = new TreeNode(pre[preS]);
root.left = build(preS + 1,preS+1+len,inS,index,map);
root.right = build(preS+1+len,preE,index+1,inE,map);
return root;
}
https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/ ↩︎