算法笔记:力扣105从前序与中序遍历序列构造二叉树

首先重要的是要明白前序遍历,和中序遍历的含义;

  • 前序遍历:根左右
  • 中序遍历:左根右

那么在前序遍历的数组中,第一位一定是根节点,而中序遍历数组中,根节点的左边部分就是该节点的左子树,右边部分就是右子树。

按照这个逻辑,就可以进行递归切分数组。

关键API:

Arrays.copyOfRange(),返回指定索引范围的数组。

代码:

因为每一个递归子树的根节点,都是前序数组的首个元素,所以就是不断递归前序数组,然后拿到每一个递归数组的首个元素,也就是根节点,然后在中序遍历中找到位置然后不断切分两个数组。

复制代码
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
            //前序遍历: 根左右
            //中序遍历: 左根右
            if(preorder.length==0||inorder.length==0){
                return null;
            }

            if(inorder.length==1){
                return new TreeNode(inorder[0]);
            }

            //首先前序遍历的第一个元素 肯定是根节点 那么找到根节点后
            //在中序遍历的数组中找到根节点   那么根节点的左边部分就是根节点的左子树  右边部分就是根节点的右子树
            int rootv=preorder[0]; //根节点
            int index=0; //根节点索引 
            for(int i=0;i<inorder.length;i++){
                if(rootv==inorder[i]){
                    //记录当前的根节点索引
                    index=i;
                    break;
                }
            }//到此已经在中序遍历数组中找到根节点 然后分为两部分
            //接下来就是递归数组确定元素
            TreeNode root=new TreeNode(rootv);

            //然后中序遍历数组就可以 左右子树范围可以找到 然后到前序遍历中找到对应的子树范围
            int []sonleft=Arrays.copyOfRange(inorder,0,index); //左子树
            int []sonright=Arrays.copyOfRange(inorder,index+1,inorder.length);;//右子树
            //然后在前序遍历中找到对应的数组范围
            int []qianleft=Arrays.copyOfRange(preorder,1,sonleft.length+1);//前序遍历 左子树部分
            int []qianright=Arrays.copyOfRange(preorder,sonleft.length+1,preorder.length);    //右子树部分 

            root.left=buildTree(qianleft,sonleft);
            root.right=buildTree(qianright,sonright);
            return root;
            

    }
   
}
相关推荐
乌萨奇也要立志学C++3 分钟前
【洛谷】BFS 求解最短路:从马的遍历到迷宫问题的实战解析
算法·宽度优先
wdfk_prog5 分钟前
[Linux]学习笔记系列 -- [drivers][tty]sysrq
linux·笔记·学习
老鼠只爱大米12 分钟前
LeetCode经典算法面试题 #46:全排列(回溯、交换、剪枝等五种实现方案详细解析)
算法·leetcode·剪枝·回溯·全排列·stj算法
Dovis(誓平步青云)25 分钟前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法
QT.qtqtqtqtqt42 分钟前
uni-app小程序前端开发笔记(更新中)
前端·笔记·小程序·uni-app
_OP_CHEN1 小时前
【算法基础篇】(五十七)线性代数之矩阵乘法从入门到实战:手撕模板 + 真题详解
线性代数·算法·矩阵·蓝桥杯·c/c++·矩阵乘法·acm/icpc
天天爱吃肉82181 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
im_AMBER1 小时前
Leetcode 114 链表中的下一个更大节点 | 删除排序链表中的重复元素 II
算法·leetcode
EmbedLinX1 小时前
嵌入式之协议解析
linux·网络·c++·笔记·学习
凉、介1 小时前
VMware 三种网络模式(桥接 / NAT / Host-Only)原理与实验解析
c语言·网络·笔记·操作系统·嵌入式·vmware