class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if(root == null) return null;
if(root.val < low){
TreeNode right = trimBST(root.right, low, high);
return right;
}
if(root.val > high){
TreeNode left = trimBST(root.left, low, high);
return left;
}
root.left = trimBST(root.left, low, high);
root.right = trimBST(root.right, low, high);
return root;
}
}
思路:
-
如果
root
为 null,则返回 null。这是递归方法的基础情况。 -
如果当前
root
节点的值小于low
,那么你可以确定该节点及其所有左子节点都在范围之外。因此,有效的树只可能在右侧。于是,你递归地调用函数修剪右子节点。 -
同样地,如果当前
root
节点的值大于high
,那么这个节点和它所有的右子节点都超出了范围。有效的树只可能在左侧。因此,你递归地调用函数修剪左子节点。 -
接住符合条件的左孩子和右孩子。
-
最后,返回修剪后的 root 节点。
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
TreeNode root = traversal(0, nums.length-1,nums);
return root;
}
public TreeNode traversal(int left, int right, int[] nums){
if(right < left) return null;
int mid = (left + right) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.right = traversal(mid+1, right, nums);
root.left = traversal(left, mid-1, nums);
return root;
}
}
思路:
- 递归函数,用于创建平衡BST。
- Base Case: 如果
right < left
,这意味着当前的子数组是空的,因此返回null
。 - 对于每个调用,它找到中间的点
mid
。由于数组已排序,所以这个中间点的值就是当前子树的根节点。 - 创建一个新的树节点,并将该中点的值赋给它。
- 对中点的左侧调用
traversal
来递归地构建左子树。 - 对中点的右侧调用
traversal
来递归地构建右子树。 - 返回当前子树的根。
class Solution {
int sum;
public TreeNode convertBST(TreeNode root) {
sum = 0;
convertBST1(root);
return root;
}
public void convertBST1(TreeNode root){
if(root == null){
return;
}
convertBST1(root.right);
sum += root.val;
root.val = sum;
convertBST1(root.left);
}
}
思路:
-
- 这是一个递归辅助函数,用于执行转换。
- Base Case: 如果节点为
null
,则直接返回。 - 首先遍历右子树,这是因为在BST中,右子树中的节点值大于当前节点。
- 更新
sum
为当前节点的值与sum
的和。 - 将当前节点的值设置为
sum
。这是因为在BST中,当前节点的新值是原始树中大于或等于当前节点值的所有值之和。 - 遍历左子树。
该代码使用了反序的中序遍历(即先遍历右子树,再处理当前节点,最后遍历左子树)