1008. 前序遍历构造二叉搜索树

简介: 1008. 前序遍历构造二叉搜索树

前序遍历构造二叉搜索树

给定一个整数数组,它表示BST(即 二叉搜索树 )的 先序遍历 ,构造树并返回其根。

保证 对于给定的测试用例,总是有可能找到具有给定需求的二叉搜索树。

二叉搜索树 是一棵二叉树,其中每个节点, Node.left 的任何后代的值 严格小于 Node.val , Node.right 的任何后代的值 严格大于 Node.val。

二叉树的 前序遍历 首先显示节点的值,然后遍历Node.left,最后遍历Node.right。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/construct-binary-search-tree-from-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

一、解题思路

BST无重复节点,给出树的先序追历结果,重建整颗树并返回头节点,如果它是搜素二叉树而且无重复,那么得到一个先序遍历的结果,它是可以还原出唯一的树出来的,如果它有重复那就不唯一了

递归的思想定义函数f(L, R):从L..R范围是一棵树的先序遍历结果,请建出整颗树把头部node返回
主函数: f(0, 8),头节点5,从1位置开始比5小的都是左树,剩下的都是比5大的右树,剩下的递归

特殊边界

左边没有比5小的,返回null, 右边f(1, 2)
一个X节点不一定都有左树,右树

class Solution {
    public TreeNode bstFromPreorder(int[] preorder) {
        if(preorder==null||preorder.length==0){
            return null;
        }
        int n=preorder.length;
        return process(preorder,0,n-1);
    }
    public TreeNode process(int[] preorder,int l,int r){
        if(l>r){
            return null;
        }
        TreeNode head=new TreeNode(preorder[l]);
        int less=l;
        for(;less<=r;less++){
            if(preorder[l]<preorder[less]){
                break;
            }
        }
        head.left=process(preorder,l+1,less-1);
        head.right=process(preorder,less,r);
        return head;
    }
}

二、使用单调栈优化

我们在递归中找离L最近比L大的数,
可以用单调栈生成nearBig数组,记录每个i位置最近比i位置大的数

class Solution {
    public TreeNode bstFromPreorder(int[] preorder) {
        if(preorder==null||preorder.length==0){
            return null;
        }
        int n=preorder.length;
        int[] stack=new int[preorder.length];
        int[] nearBig=new int[n];
        for(int i=0;i<n;i++){
            nearBig[i]=-1;
        }
        int size=0;
        for(int i=0;i<n;i++){
            while(size!=0&&preorder[stack[size-1]]<preorder[i]){
                nearBig[stack[--size]]=i;
            }
            stack[size++]=i;
        }
        return process(preorder,0,n-1,nearBig);
    }
    public TreeNode process(int[] preorder,int l,int r,int[] nearBig){
        if(l>r){
            return null;
        }
        
        int less=(nearBig[l]==-1||nearBig[l]>r)?r+1:nearBig[l];
        int less=l;
        for(;less<=r;less++){
            if(preorder[l]<preorder[less]){
                break;
            }
        }
        TreeNode head=new TreeNode(preorder[l]);
        head.left=process(preorder,l+1,less-1,nearBig);
        head.right=process(preorder,less,r,nearBig);
        return head;
    }
}
相关文章
|
存储 编译器 C语言
【C/C++ 函数返回的奥秘】深入探究C/C++函数返回:编译器如何处理返回值
【C/C++ 函数返回的奥秘】深入探究C/C++函数返回:编译器如何处理返回值
1048 3
|
9月前
|
存储 SQL 前端开发
【若依RuoYi-Vue | 项目实战】帝可得后台管理系统(二)
接着上回的【若依RuoYi-Vue | 项目实战】基于若依的帝可得后台管理系统(一),本次我们继续完成人员管理、设备管理、策略管理模块的开发。
1369 6
【若依RuoYi-Vue | 项目实战】帝可得后台管理系统(二)
|
JSON 安全 数据安全/隐私保护
【Web】token机制
【Web】token机制
|
9月前
|
存储 NoSQL Linux
linux之core文件如何查看和调试
通过设置和生成 core 文件,可以在程序崩溃时获取详细的调试信息。结合 GDB 等调试工具,可以深入分析 core 文件,找到程序崩溃的具体原因,并进行相应的修复。掌握这些调试技巧,对于提高程序的稳定性和可靠性具有重要意义。
3732 6
|
12月前
|
人工智能 算法 安全
深度讲解-互联网算法备案指南和教程
随着人工智能和大数据技术的发展,互联网算法在内容推荐、用户画像等领域日益重要,但也带来了安全风险和合规挑战。国家互联网信息办公室为此发布了《互联网算法备案管理规定》,要求具有舆论属性或社会动员能力的互联网信息服务提供者进行算法备案,以确保算法透明性和合规性,维护网络健康秩序。唯安创远AI合规专家将解析备案的必要性、流程及其对企业的影响,帮助企业顺利完成备案。
946 3
|
设计模式 Java 程序员
《On Java 8》中文版,又名《Java 编程思想》中文第五版
《On Java 8》中文版,又名《Java 编程思想》中文第五版
446 0
|
SQL XML Java
ruoyi若依框架@DataScope注解使用以及碰到的一些问题
ruoyi若依框架@DataScope注解使用以及碰到的一些问题
4022 0
|
Ubuntu Linux
Linux查看系统版本和内核版本
Linux查看系统版本和内核版本
|
存储 缓存 Java
【linux线程(四)】初识线程池&手撕线程池
【linux线程(四)】初识线程池&手撕线程池
|
Windows
解决windows下Qt Creator显示界面过大的问题
解决windows下Qt Creator显示界面过大的问题