zoukankan      html  css  js  c++  java
  • [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;
        }
    }
    
  • 相关阅读:
    Notebook ++ 设置护眼背景
    python 设置 excel 单元格颜色填充和字体效果
    python 设置 Excel 单元格边框线的各种风格
    python 对 excel sheet 的插入、复制、删除、重命名、设置标签颜色操作
    python 利用插入空行的方式制作工资条表格
    python 更新 openpyxl 到 3.0
    python 模拟 excel 宏、VBA 制作工资条表格
    Windows 系统
    python-pptx 实践 6.2:气泡图
    python-pptx 实践 6.1:添加五种基本图形(柱形图、折线图、饼图、条形图、散点图)
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/12250420.html
Copyright © 2011-2022 走看看