当前位置: 首页 > article >正文

Leetcode 538 把二叉搜索树转换为累加树

理解题意

        所谓累加树:对于每个节点,将所有比它大的点累加于这一点。

        而二叉搜索树:任何一个中间节点,都大于左子树任何节点,小于右子树所有节点。

        而二叉搜索树中序排列是严格单调递增的序列。

        所以二叉搜索树累加树的话,则是将右子树的节点加到中间节点,再将中间节点加到左子树。

        从中序序列来看,可以使用双指针节点,一个pre指针,一个cur指针。从后往前遍历,将pre指向比cur大的值,始终将pre加到cur

         从树的结构来看,pre之上前一位比cur值大的节点,cur指向当前最大的节点。

        树的遍历顺序为:右中左

解题方法:

        递归 迭代

1.递归

节点处理顺序为右中左,pre总是指向比当前值大的值的累加和。

public TreeNode convertBST(TreeNode root) {
        AddBST(root);
        return root;
    }
    //指向比当前值大的值的累加
    int pre=0;
    public void AddBST(TreeNode cur) {
        if(cur==null)return;
        if(cur.right!=null){
            AddBST(cur.right);
        }
        cur.val+=pre;
        pre=cur.val;
        if(cur.left!=null) AddBST(cur.left);
    }

2.迭代

入栈顺序总是左中右,出栈顺序右中左,pre总是指向比当前值大的值的累加和。

    public TreeNode convertBST(TreeNode root) {
        if(root==null) return root;
        int pre=0;
        Stack<TreeNode> stack=new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode cur=stack.pop();
            if(cur!=null){
                if(cur.left!=null) stack.push(cur.left);
                stack.push(cur);
                stack.push(null);
                if(cur.right!=null) stack.push(cur.right);
            }else{
                cur=stack.pop();
                cur.val+=pre;
                pre=cur.val;
            }
        }
        return root;
    }

3.分析

时间复杂度:

        递归:O(n)

        迭代:O(n)

空间复杂度:

        递归:O(n)

        迭代:O(2n)


http://www.kler.cn/a/156865.html

相关文章:

  • 【C++】一种针对代码的连续条件检查方案,累计布尔结果
  • WebRTC API分析
  • JQuery封装的ajax
  • leetcode hot100【LeetCode 114.二叉树展开为链表】java实现
  • jmeter常用配置元件介绍总结之定时器
  • AI绘画经验(stable-diffusion)
  • 管理Android12系统的WLAN热点
  • OpenAI发布一周年,那些声称超过它的模型都怎么样了?
  • 如何知道B站各分区直播数据趋势?
  • MySQL进阶_EXPLAIN重点字段解析
  • 语音芯片的BUSY状态指示功能特征:提升用户体验与系统稳定性的关键
  • JAVA Spring boot Process finished with exit code 0
  • golang channel执行原理与代码分析
  • 基于Langchain的txt文本向量库搭建与检索
  • 菜鸟学习日记(python)——数据类型转换
  • 记一次ThreadPoolTaskExecutor的坑
  • 2023年道路运输企业主要负责人证模拟考试题库及道路运输企业主要负责人理论考试试题
  • IRS辅助的隐蔽通信 (IRS aided covert communication)
  • csapp-linklab之第3阶段“输出学号”实验报告(强弱符号)
  • qt 安装
  • [C/C++]数据结构 堆排序(详细图解)
  • C++ 基础篇
  • 预约按摩小程序有哪些功能特点?
  • autojs-ui悬浮按钮模板
  • 【C语言】存储类型说明符——auto、static、extern、register
  • 华为OD机试真题-电脑病毒感染-2023年OD统一考试(C卷)