首页 > 其他分享 >二叉搜索树序列

二叉搜索树序列

时间:2024-06-13 14:57:17浏览次数:30  
标签:sonRes node List ArrayList list 二叉 搜索 序列 节点

题目链接

二叉搜索树序列

题目描述

注意点

  • 二叉搜索树中的节点数在 [0, 1000] 的范围内
  • 1 <= 节点值 <= 10^6

解答思路

  • 本题的题目解释成一句话也就是:每一个节点都必须排在其子孙节点的前面,同一层的节点可以任意排列
  • 首先想到的是广度优先遍历,将每一层的节点加入到一个List中,同一层的n个节点可以随意排列,有(n + 1) * n / 2种排列方式,当选出n个节点中某个节点i加入路径时,还需要将其左右节点加入到List末尾,左右节点可以排在同一层其他节点前面,但必须在根节点i后面。因为要寻找所有可能的序列,在选出某个节点作为路径后,还要考虑其他节点作为路径的情况,所以要进行回溯,需要将该节点从路径中移除,并且将List还原

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> BSTSequences(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        List<TreeNode> list = new ArrayList<>();
        if (root != null) {
            list.add(root);
        }
        List<Integer> sonRes = new ArrayList<>();
        bfs(res, sonRes, list);
        return res;
    }

    public void bfs(List<List<Integer>> res, List<Integer> sonRes, List<TreeNode> list) {
        // 队列为空,说明树已遍历完
        if (list.isEmpty()) {
            res.add(new ArrayList<>(sonRes));
            return;
        }
        int n = list.size();
        List<TreeNode> copy = new ArrayList<>(list);
        for (int i = 0; i < n; i++) {
            TreeNode node = list.get(i);
            sonRes.add(node.val);
            list.remove(i);
            if (node.left != null) {
                list.add(node.left);
            }
            if (node.right != null) {
                list.add(node.right);
            }
            bfs(res, sonRes, list);
            // 回溯
            sonRes.remove(sonRes.size() - 1);
            list = new ArrayList<>(copy);
        }
    }
}

关键点

  • 理解题意
  • 回溯的思想,不仅要将节点从路径中移除,还要将List还原,才能找到所有的路径,同时防止子孙节点出现在根节点前面

标签:sonRes,node,List,ArrayList,list,二叉,搜索,序列,节点
From: https://blog.csdn.net/weixin_51628158/article/details/139630017

相关文章

  • 二叉搜索树(待补充)
    二叉搜索树,是指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;任意节点的左,右子树也分别为二叉搜索树;没有键值相等的节点。用Java来表示二叉树p......
  • (nice!!!)LeetCode 2813. 子序列最大优雅度(反悔贪心)
    2813.子序列最大优雅度思路:1.先对数组items按profit进行降序排序。2.把前k个最大的profit选中3.再遍历剩余的项目,看看能不能增加类别的数量。因为profit是递减的,所以只有类别的数量能增大的情况下,才考虑从选中的k个项目当中删掉重复的类别项目里面的最小profit。细节......
  • 力扣刷题记录: 1339. 分裂二叉树的最大乘积
        本题是第174场周赛的Q3,LC竞赛分为1675.方法一.递归(超时)    单纯使用递归对每一个节点进行遍历,代码如下:classSolution{longlongans=-1;public:intmaxProduct(TreeNode*root){longlongtotal_sum=sum(root);......
  • Python对象序列化库之dill使用详解
    概要在Python编程中,序列化(Serialization)和反序列化(Deserialization)是处理对象持久化和数据传输的常见任务。Python提供了内置的 pickle 模块用于对象序列化,但它在处理复杂对象(如带有lambda函数、生成器和闭包的对象)时存在一定局限性。dill 库是 pickle 的一个扩展......
  • LeetCode132双周赛T3,搜索和DP
    求出最长好子序列Idfs(i,j)表示以nums[i]结尾的,至多有j对相邻元素不同的最长序列的长度转移:枚举p<i,如果nums[p]!=nums[i],就从dfs(p,j-1)+1转移过来如果nums[p]==nums[i],就从dfs(p;j)+1转移过来classSolution{public:intmaximumLength(vector<int......
  • shiro反序列化分析
    shiro反序列化分析基础知识简单介绍关键组件SecurityManagerSubjectRealm总结shiro安全框架在web中使用配置文件配置具体实现ShiroFilter过滤器分析shiro的漏洞shiro550链子分析序列化加密cookie反序列化解密cookie验证总结poc编写存在的问题和解决CC6+TemplatesIml......
  • 【Test 66 】 高阶数据结构 二叉搜索树 必会知识点!
    文章目录1.二叉搜索树的概念2.二叉搜索树K模型的代码实现2.1Find()查找的实现2.2Insert()插入的实现2.3InOrder()中序遍历的实现2.4Erase()删除的实现3.二叉搜索树的KV模型4.二叉搜索树的性能分析1.二叉搜索树的概念......
  • 线程池的使用:批量导入、数据汇总、异步保存搜索记录
    文章目录1、场景一:MySQL批量导入数据到ES1.1CountDownLatch1.2流程图1.3代码实现1.4效果2、场景二:数据汇总2.1流程图2.2代码实现3、场景三:异步调用3.1需求3.2代码实现1、场景一:MySQL批量导入数据到ES场景:需要将库里的1000万左右的数据量,导入到ES索引库中......
  • QTime序列化时间处理(字符串与秒、毫秒互转)
    秒转为时、分、秒格式inttime_sec=11320;QStringtime=QTime(0,0,0).addSecs(static_cast<int>(time_sec)).toString(QString::fromLatin1("HH:mm:ss"));qDebug()<<time;//输出:"03:08:40"毫秒转为时、分、秒、毫秒格式inttime_ms=211320;QString......
  • transient关键字与序列化
    一、transient关键字小结1、变量被transient修饰,变量将不会被序列化2、transient关键字只能修饰变量,而不能修饰方法和类。3、被static关键字修饰的变量不参与序列化,一个静态static变量不管是否被transient修饰,均不能被序列化。4、final变量值参与序列化,finaltransient同时修......