链接力扣669. 修剪二叉搜索树
思路
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
// 如果遇到不合适的,不能直接将其砍掉
// 如果是左子树根节点小了:则要考虑左子树的右孩子会不会在范围之内
// 如果是右子树根节点大了:则要考虑右子树的左孩子会不会在范围之内
if(root == null) return root;
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;
}
}
链接力扣108.将有序数组转换为二叉搜索树
思路
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return BST(nums,0,nums.length - 1);
}
public TreeNode BST(int[] nums,int startIndex,int endIndex){
// 如果是左闭右开:则左右索引可能会相等,但相等了就越界了
// 没有等号的情况下,则不是左闭右开:则可以相等,这样可以将这个节点包含进来
if(startIndex > endIndex) return null;
int mid = (startIndex + endIndex) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = BST(nums,startIndex,mid-1);
root.right = BST(nums,mid+1,endIndex);
return root;
}
}
链接力扣538.把二叉搜索树转换为累加树
思路
class Solution {
int pre = 0;
public TreeNode convertBST(TreeNode root) {
if(root == null) return root;
// 右、中、左的顺序
convertBST(root.right);
root.val += pre;
pre = root.val;
convertBST(root.left);
return root;
}
}