题目描述:
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int pre_idx = 0;
int[] preorder;
int[] inorder;
HashMap<Integer,Integer> map = new HashMap<>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.preorder = preorder;
this.inorder = inorder;
int index = 0;
for (int i : inorder) {
map.put(i,index++);
}
return help(0,inorder.length);
}
private TreeNode help(int in_left,int in_right) {//右边界是达不到的边界
if(in_left == in_right){
return null;
}
int root_val = preorder[pre_idx++];
TreeNode root = new TreeNode(root_val);
int idx = map.get(root_val);
root.left = help(in_left,idx);
root.right = help(idx+1,in_right);
return root;
}
}
思路概述:
preorder按顺序来是相对的根节点。之后再看inorder数组,在根节点元素之前的就在左子树,在根节点元素之后的就在右子树。
所以我们先创建一个hashmap来记录inorder元素及其坐标,因为我们需要多次查找元素对应的位置,这样更快捷。
定义一个pre_idx来记录确定到preorder数组的第几个元素位置了,每次递归函数得到一个root_val并使pre_idx加一。之后创建节点,通过hashmap和inorder判断左右子树,递归得到。