day21 538. 把二叉搜索树转换为累加树&&108. 将有序数组转换为二叉搜索树&&669. 修剪二叉搜索树
- 把二叉搜索树转换为累加树
你的代码实现了将二叉搜索树(BST)转换为累加树的功能。核心思路是利用BST的性质,通过反向中序遍历(右-根-左),从大到小累加节点值。具体实现如下:
使用一个全局变量 sum1 来记录累加和。
在反向中序遍历过程中,先遍历右子树,然后更新当前节点的值为累加和,最后遍历左子树。
这种方法利用了BST的有序性,确保每个节点的值等于原树中大于或等于该节点值的所有节点值之和。
//538. 把二叉搜索树转换为累加树
private int sum1=0;
public TreeNode convertBST(TreeNode root) {
if (root == null) {
return null;
}
//反向遍历,从大到小
reverseInorderTraversal(root);
return root;
}
private void reverseInorderTraversal(TreeNode root) {
if (root == null) {
return;
}
// 先遍历右子树
reverseInorderTraversal(root.right);
// 将当前节点的值累加到累加和中
sum1 += root.val;
// 更新当前节点的值为累加和
root.val = sum1;
// 再遍历左子树
reverseInorderTraversal(root.left);
}
-
将有序数组转换为二叉搜索树
你的代码实现了将有序数组转换为平衡二叉搜索树(BST)的功能。核心思路是通过递归构建树:
每次选择数组的中间值作为当前子树的根节点,这样可以保证左右子树的高度平衡。
递归地在左半部分和右半部分分别构建左子树和右子树。
通过这种方式,最终构建出的BST是高度平衡的。
//108. 将有序数组转换为二叉搜索树
public TreeNode sortedArrayToBST(int[] nums) {
if (nums == null || nums.length == 0) {
return null;
}
return dfsSort(nums, 0, nums.length - 1);
}
private TreeNode dfsSort(int[] nums,int start,int end) {
if(start > end) return null;
int mid = (start+end)/2;
TreeNode root = new TreeNode(nums[mid]);
root.left = dfsSort(nums,start,mid-1);
root.right = dfsSort(nums,mid+1,end);
return root;
} -
修剪二叉搜索树
你的代码实现了修剪二叉搜索树的功能,使其只包含值在 [low, high] 范围内的节点。核心思路如下:
如果当前节点的值小于 low,则修剪后的树在右子树中。
如果当前节点的值大于 high,则修剪后的树在左子树中。
如果当前节点的值在 [low, high] 范围内,则递归修剪其左子树和右子树。
//669. 修剪二叉搜索树
public TreeNode trimBST(TreeNode root, int low, int high) {
if (root == null) return null;
// 如果当前节点值小于low,修剪后的树在右子树中
if (root.val < low) {
return trimBST(root.right, low, high);
}
// 如果当前节点值大于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;
}

浙公网安备 33010602011771号