Day18:二叉树part8(669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树)

669.修剪二叉搜索树

题目链接https://leetcode.cn/problems/trim-a-binary-search-tree/description/

给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。

总结

修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。

如果root(当前节点)的元素小于low,那么应该递归右子树,并返回右子树符合条件的头结点。

如果root(当前节点)的元素大于high,那么应该递归左子树,并返回左子树符合条件的头结点。

接下来要将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。

最后返回root节点

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);
        }
        if (root.val > high) {
            return trimBST(root.left, low, high);
        }
        // root在[low,high]范围内
        root.left = trimBST(root.left, low, high);
        root.right = trimBST(root.right, low, high);
        return root;
    }
}

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

题目链接https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

总结

如果根据数组构造一棵二叉树。

本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间

分割点就是数组中间位置的节点。

java 复制代码
class Solution {
	public TreeNode sortedArrayToBST(int[] nums) {
		return traversal(nums, 0, nums.length - 1);
	}

	// 左闭右闭区间[left, right]
	private TreeNode traversal(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 = traversal(nums, left, mid - 1);
		root.right = traversal(nums, mid + 1, right);
		return root;
	}
}

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

题目链接https://leetcode.cn/problems/convert-bst-to-greater-tree/description/

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

提醒一下,二叉搜索树满足下列约束条件:

节点的左子树仅包含键 小于 节点键的节点。 节点的右子树仅包含键 大于 节点键的节点。 左右子树也必须是二叉搜索树。

示例 1:

  • 输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
  • 输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

示例 2:

  • 输入:root = [0,null,1]
  • 输出:[1,null,1]

示例 3:

  • 输入:root = [1,0,2]
  • 输出:[3,3,2]

示例 4:

  • 输入:root = [3,2,4,1]
  • 输出:[7,9,4,10]

提示:

  • 树中的节点数介于 0 和 104 之间。
  • 每个节点的值介于 -104 和 104 之间。
  • 树中的所有值 互不相同 。
  • 给定的树为二叉搜索树。

总结

从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了

java 复制代码
class Solution {
    private TreeNode pre = null;
    public TreeNode convertBST(TreeNode root) {
        addTree(root);
        return root;
    }
    private void addTree(TreeNode root) {
        if (root == null) return;
        addTree(root.right);

        if (pre != null)    root.val += pre.val;
        pre = root;

        addTree(root.left);
    }
}
相关推荐
努力学算法的蒟蒻4 分钟前
day47(12.28)——leetcode面试经典150
算法·leetcode·面试
byzh_rc13 分钟前
[算法设计与分析-从入门到入土] 复杂算法
数据库·人工智能·算法·机器学习·支持向量机
222you15 分钟前
前后端分离项目在云服务器上的部署(Spring Boot + Vue)
运维·服务器·spring boot
Sunsets_Red18 分钟前
待修改莫队与普通莫队优化
java·c++·python·学习·算法·数学建模·c#
葡萄城技术团队22 分钟前
在 Java 中优化 MySQL 查询以提升性能
java·开发语言·mysql
QT 小鲜肉23 分钟前
【Linux命令大全】001.文件管理之lsattr命令(实操篇)
linux·运维·服务器·笔记·elasticsearch
杀死那个蝈坦25 分钟前
短链接生成-基于布隆过滤器和唯一索引
java·数据库·微服务·oracle·rocketmq
慕白Lee25 分钟前
Java foreach在lambda的foreach遍历中退出操作(lambda foreach break)
java
winfield82128 分钟前
Java 中大量闲置 MySQL 连接的解决方案(从根因到落地)
java·mysql
moxiaoran575331 分钟前
Java开发中VO的使用
java·开发语言