[LeetCode]105. 从前序与中序遍历序列构造二叉树(递归)、108. 将有序数组转换为二叉搜索树(递归、二分)

题目 05. 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。

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

题解

  • 使用HashMap记录当前子树根节点在中序遍历中的位置,方便每次查找。
  • 递归
    • 递归传参:该子树对应的前序遍历和中序遍历(用开始结束指针表示即可)
    • 递归终止条件:序列长度为0,返回null;
    • new当前子树根节点,左右孩子分别赋值为递归的返回值(通过确定左子树节点数确定前序遍历分割点),返回当前子树根节点。

代码

class Solution {
    private Map<Integer,Integer> inIdxMap= new HashMap<>();
    private int[] preorder;
    private int[] inorder; 
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        for(int i=0;i<inorder.length;++i){
            inIdxMap.put(inorder[i],i);
        }
        this.preorder = preorder;
        this.inorder = inorder;

        TreeNode root=buildHelper(0,preorder.length,0,inorder.length);
        return root;
    }

    public TreeNode buildHelper(int preL,int preR,int inL,int inR){
        if(preL==preR){return null;}

        TreeNode node = new TreeNode(preorder[preL]);

        int inIdx=inIdxMap.get(node.val);
        int leftNodeCnt =  inIdx - inL;
        int preSplitIdx = preL+leftNodeCnt+1;
        node.left=buildHelper(preL+1,preSplitIdx,inL,inIdx);
        node.right=buildHelper(preSplitIdx,preR,inIdx+1,inR);

        return node;
    }
}

题目

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

题解

与上面的题类似,传参也是树对应序列的左右边界。只是要用二分找到分界点。

代码

class Solution {
    int[] nums;

    public TreeNode sortedArrayToBST(int[] nums) {
        this.nums=nums;
        return helper(0,nums.length-1);
    }

    public TreeNode helper(int l, int r){
        if(l>r){return null;}

        int p=l+(r-l)/2;
        TreeNode node = new TreeNode(nums[p]);
        node.left=helper(l,p-1);
        node.right=helper(p+1,r);
        return node;
    }
}

posted on 2020-02-01 22:07  coding_gaga  阅读(163)  评论(0编辑  收藏  举报

导航