文章目录
- 修剪二叉搜索树
- 将有序数组转换为二叉搜索树
- 把二叉搜索树转换为累加树
修剪二叉搜索树
题目链接:669. 修剪二叉搜索树
解题逻辑:
因为在删除的同时要保证相对结构,所以我们不能沿用上一篇文章中的删除逻辑,新的删除逻辑为:
- 如果是叶子节点且不在范围内,直接删除
- 如果该节点值小于最小值,则返回该节点的右子树(因为右子树大于最小值,此时右子树中不符合条件的值已经被删除了)
- 如果该节点值大于最大值,则返回该节点的左子树(因为左子树小于最大值,此时左子树中不符合条件的值已经被删除了)
代码如下:
class Solution {public TreeNode trimBST(TreeNode root, int low, int high) {if(root == null) return null;TreeNode left = trimBST(root.left,low,high);TreeNode right = trimBST(root.right,low,high);if(root.val < low || root.val > high) {if(left == null && right == null) return null;else if(root.val < low) return right;else if(root.val > high) return left;}root.left = left;root.right = right;return root;}
}
将有序数组转换为二叉搜索树
题目链接:108. 将有序数组转换为二叉搜索树
本题是根据一个有序数组创建一个平衡的二叉搜索树,核心思想就是:将数组从nums.length / 2开始切分,nums.length / 2索引对应的数值作为当前节点的值,左边的为左子树的节点值、右边为右子树的节点值。这样递归切分构造,最后得到的一定是一个平衡的二叉搜索树。
代码如下:
class Solution {public TreeNode sortedArrayToBST(int[] nums) {if(nums.length == 0) return null;int devide = nums.length / 2;TreeNode left = sortedArrayToBST(Arrays.copyOfRange(nums, 0, devide));TreeNode right;if(devide + 1 >= nums.length) right = sortedArrayToBST(new int[0]);else right = sortedArrayToBST(Arrays.copyOfRange(nums, devide + 1, nums.length));TreeNode node = new TreeNode(nums[devide]);node.left = left;node.right = right;return node;}
}
把二叉搜索树转换为累加树
题目链接:538. 把二叉搜索树转换为累加树
解题逻辑:
我们直接使用中序遍历是从小到大遍历,此时数值不好做累加(因为后面的值我们都不知道)。所以我们可以将整个二叉搜索树进行翻转,然后再使用中序遍历修改节点,此时是从大到小遍历,累加值是已知的,所以节点的值更好累加。构造完之后,再翻转一次还原即可。
代码如下:
class Solution {int num = 0;public TreeNode convertBST(TreeNode root) {reverseBST(root);changeBST(root);reverseBST(root);return root;}public void changeBST(TreeNode root){if(root == null) return;changeBST(root.left);int history = root.val;root.val += num;num += history;changeBST(root.right);}public void reverseBST(TreeNode root){if(root == null) return;reverseBST(root.left);reverseBST(root.right);TreeNode temp = root.left;root.left = root.right;root.right = temp;}
}