代码随想录day21 | leetcode 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 二叉树总结篇

669.修剪二叉搜索树

调用递归实现剪枝

java 复制代码
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);  //如果当前节点的值小于low,意味着当前节点及其左子树中的所有节点都小于low,不符合要求。这时,应该跳过当前节点和左子树,递归处理右子树
        if(root.val > high) return trimBST(root.left, low, high); //同理
		
        root.left = trimBST(root.left, low, high); //修剪的目的是删除不在[low, high]范围内的节点 当某个节点不在范围内时,我们选择跳过该节点,并根据其值选择保留左子树或右子树。
        root.right = trimBST(root.right, low, high); 
        return root;
    }
}
1. 当前节点值小于 low
java 复制代码
if(root.val < low) return trimBST(root.right, low, high);
  • 如果当前节点的值小于 low,意味着当前节点及其左子树中的所有节点都小于 low,不符合要求。
  • 这时,应该跳过当前节点和左子树,递归处理右子树。
  • 返回右子树的修剪结果作为新的子树。
2. 当前节点值大于 high
java 复制代码
if(root.val > high) return trimBST(root.left, low, high);
  • 如果当前节点的值大于 high,意味着当前节点及其右子树中的所有节点都大于 high,不符合要求。
  • 这时,应该跳过当前节点和右子树,递归处理左子树。
  • 返回左子树的修剪结果作为新的子树。
3. 当前节点符合范围
java 复制代码
root.left = trimBST(root.left, low, high);
root.right = trimBST(root.right, low, high);
return root;
  • 如果当前节点的值在 [low, high] 范围内,保留当前节点。
  • 对当前节点的左子树和右子树分别递归调用 trimBST,修剪它们。
  • 将修剪后的左子树和右子树分别赋值给 root.leftroot.right
  • 返回当前节点 root

108.将有序数组转换为二叉搜索树

左闭右闭 左等于右合法

java 复制代码
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return traveal(nums, 0, num.length);
    }
    public TreeNode traveal(int[] nums, left, right) {
        //左闭右开   
        if(left >= right) return null;   //left > righ 左闭右闭
        
        int mid = (left + right) / 2;  //int mid = left + ((right - left) >> 1); 改进版
        
        TreeNode root = new TreeNode(nums[mid]);  //创建二叉搜索树的根节点
        root.left = traveal(nums, left, mid);  //(nums, left, mid - 1) 左闭右闭
        root.right = traveal(nums, mid + 1,right) //(nums, mid + 1, right) 左闭右闭
        return root;
    }
}

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

java 复制代码
class Solution {
    //双指针 累加前面的题有这样的写法
    int pre = 0;
    public TreeNode convertBST(TreeNode cur) {
        if(cur == null) return null;
        convertBST(cur.right);  
        cur.val += pre;
        pre = cur.val;
        convertBST(cur.left);
        return cur;
    }   
}

为什么用反中序遍历?

1. 二叉搜索树的性质:

  • 在中序遍历中,BST 的节点值是从小到大的顺序。
  • 反中序遍历(右-根-左)则是从大到小的顺序。

2. 累加树的构建规则:

  • 计算累加和时,需要从最大的节点开始累加。
  • 依次向前,当前节点的值加上之前所有节点的累加和(即 pre 变量),再将结果赋给当前节点。

二叉树总结篇

大体分分类

  • 涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。
  • 求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。
  • 求二叉搜索树的属性,一定是中序了,运用有序性了。

注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,leetcode257.找所有路径也用了前序,这是为了方便让父节点指向子节点。

相关推荐
都叫我大帅哥8 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.8 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
稚南城才子,乌衣巷风流9 小时前
支配树(Dominator Tree)详解:概念、算法与应用
算法
稚南城才子,乌衣巷风流9 小时前
动态开点:原理、实现与应用场景
数据结构·算法
yyds_yyd_100869 小时前
1464. 数组中两元素的最大乘积(2026.07.27)
数据结构·c++·算法·leetcode
腻害兔9 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:IM 即时通讯模块,一个被低估的「全功能聊天系统」
java·前端·vue.js·产品经理·ai编程
心念枕惊10 小时前
.NET CORE 授权进阶-角色、策略与动态权限实现
java·前端·.netcore
KaMeidebaby10 小时前
卡梅德生物技术快报 | 核酸适配体文库测序:核酸适配体文库测序的技术原理、实验流程与数据解析
前端·网络·数据库·人工智能·算法
geovindu11 小时前
CSharp: Breadth First Search Algorithm and Depth First Search Algorithm
开发语言·后端·算法·c#·.net·搜索算法
景同学11 小时前
把 AI 用到线上运维:可行、有效,前提是喂足信息——一次 Full GC 排障实录
java·人工智能·后端