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

Day 18

修建二叉搜索树

link:669. 修剪二叉搜索树 - 力扣(LeetCode)

思路分析

注意修剪的时候要考虑到全部的节点,即搜到到限定区间小于左值或者大于右值时还需要检查当前不符合区间大小节点的右子树/左子树,不能直接返回null.
剪去节点只需要在判断当前节点左/右子树后将root的左/右节点更新即可.
在这里插入图片描述

递归
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        if(root == null) {
            return null;
        }
        if(root.val < low) {
            return trimBST(root.right,low,high);
        }
        if(root.val > high) {
            return trimBST(root.left,low,high);
        }
        root.left = trimBST(root.left,low,high);
        root.right = trimBST(root.right,low,high);
        return root;
    }
}
将有序数组转化为平衡二叉树

link:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)

思路分析

给了升序数组其实一开始想的也是第一个参数是左子树最左边的值,然后去选中间节点做切割.
具体就需要怎么在偶数和奇数参数个数下都适配,其实偶数情况无非是选取中间的两个数(left + (right - left) / 2).

题目给的输入输出示例其实也已经帮我们提供了两种思路.
在这里插入图片描述

递归+双指针
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
//采用左闭右闭区间
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
         return sort(nums,0,nums.length - 1);  
    }
    TreeNode sort(int[] nums, int left, int right) {
        if(left > right) {
            return null;
        }
        int mid = left + ((right - left) >> 1);
        TreeNode root = new TreeNode(nums[mid]);
        root.left = sort(nums,left,mid - 1);
        root.right = sort(nums,mid + 1,right);
        return root;
    }
}
把二叉搜索树转换为累加树

link:538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)

思路分析

第一遍看题目还有点没看明白(挠头.jpg
其实就是对于树中的每个节点,计算它的值加上树中所有大于该节点值的节点的值.但是保证搜索二叉树的定义,那就是左子树的节点值必须小于节点的值,右子树的节点值必须大于节点的值.那我们就从右子树入手,反向中序遍历(右根左)确保累加时考虑了所有大于当前节点的值.
和上一题相同的思路.

递归+双指针
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int pre = 0;
    public TreeNode convertBST(TreeNode root) {
        travsal(root);
        return root;
    }
   void travsal(TreeNode root) {
    if (root == null) {
        return; // 如果当前节点为空,直接返回
    }
    travsal(root.right);  // 先遍历右子树
    root.val += pre;      // 将当前节点的值加上pre
    pre = root.val;       // 更新pre为当前节点的新值
    travsal(root.left);   // 再遍历左子树
   }
}

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

相关文章:

  • pytest日志总结
  • Go语言进阶依赖管理
  • Consumer Group
  • python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改
  • 索引(MySQL)
  • el-progress进度条框开着时,要实时刷新显示进度条
  • 04高可用高并发(D1_高并发 - D1_缓存)
  • ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
  • 设计模式之 状态模式
  • WonderJourney 部署踩坑笔记 2024 ok
  • Java方法中的可变参数列表
  • 【C#】面向对象:矩形类计算周长和面积
  • 【java-Neo4j 5开发入门篇】-最新Java开发Neo4j
  • 《OpenCV 图像缩放、翻转与变换全攻略:从基础操作到高级应用实战》
  • 考虑楼宇空间布局的电力系统集群规划策略【集群划分】
  • 【课堂笔记】隐私计算实训营第四期:“隐语”可信隐私计算开源框架
  • 国外地区经纬度查询免费API接口教程
  • 【深入学习大模型之:微调 GPT 使其自动生成测试用例及自动化用例】
  • Android Compose实现一个文字跑马灯效果控件
  • D76【 python 接口自动化学习】- python 基础之 HTTP
  • 漫步北京小程序构建智慧出行,打造旅游新业态模式
  • box-sizing
  • 了解Redis(第一篇)
  • Ubuntu20.04下安装向日葵
  • 更高效的Java 23开发,IntelliJ IDEA助力全面升级
  • unity中:超低入门级显卡、集显(功耗30W以下)运行unity URP管线输出的webgl程序有那些地方可以大幅优化帧率