目录
题目一:修剪二叉搜索树
题目描述:
给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构
思路分析:(视频指路)
区分要删除节点的值与边界值大小的对比情况,并将其左右孩子返回给上一层
解法:递归
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;
}
}
题目二:将有序数组转换为二叉搜索树
题目描述:
给你一个整数数组 nums
,其中元素已经按升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树
思路分析:(视频指路)
找出中间节点,定义好区间的闭开
递归:左闭右开
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return sort(nums, 0, nums.length);
}
// 左闭右开
public TreeNode sort(int[] nums, int left, int right) {
if (left >= right) return null;
int mid = left + (right - left) / 2;
TreeNode root = new TreeNode(nums[mid]); // 构造根节点
root.left = sort(nums, left, mid); // 递归构造左子树
root.right = sort(nums, mid + 1, right); // 递归构造右子树
return root;
}
}
递归:左闭右闭
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return sort(nums, 0, nums.length - 1);
}
// 左闭右闭
public TreeNode sort(int[] nums, int left, int right) {
if (left > right) return null;
int mid = left + (right - left) / 2;
TreeNode root = new TreeNode(nums[mid]); // 构造根节点
root.left = sort(nums, left, mid - 1); // 递归构造左子树
root.right = sort(nums, mid + 1, right); // 递归构造右子树
return root;
}
}
题目三:把二叉搜索树转换为累加树
题目描述:
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和
思路分析:(来自力扣题解)
按照右、中、左的顺序遍历,在遍历过程中将已经遍历的节点的值进行累加,然后再赋值给当前节点
解法:递归
class Solution {
int sum = 0;
public TreeNode convertBST(TreeNode root) {
if (root == null) return null;
convertBST(root.right);
sum += root.val; // 把值累加到sum中
root.val = sum; // 把sum赋值给当前节点
convertBST(root.left);
return root;
}
}