105. 从前序与中序遍历序列构造二叉树(中等题)

题目描述:
根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 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判断左右子树,递归得到。

发布了258 篇原创文章 · 获赞 5 · 访问量 5339

猜你喜欢

转载自blog.csdn.net/weixin_43105156/article/details/104192803
今日推荐