1. 修剪二叉搜索树
找到要删除的节点,不能直接返回null;
还要看当前节点值和上下边界值的比较决定向哪一边继续递归
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if(root == null) return root;
if(root.val < low)
return trimBST(root.right, low, high);
if(root.val > high)
return trimBST(root.left, low, high);
root.right = trimBST(root.right, low, high);
root.left = trimBST(root.left, low, high);
return root;
}
}
2. 将有序数组转换为二叉搜索树
108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
找数组中间元素,中间元素左右两边区间分别为左右子树
[left,right)
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return deal(nums, 0, nums.length);
}
public TreeNode deal(int[] nums, int left, int right){
if(left>=right) return null;
if(right - left == 1) return new TreeNode(nums[left]);
int mid = left + (right - left) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = deal(nums, left, mid);
root.right = deal(nums, mid+1, right);
return root;
}
}
3. 把二叉搜索树转换为累加树
538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)
从最大值开始(倒序) 右中左
pre记录上一个节点
class Solution {
//右中左
TreeNode pre;
int sum = 0;
public TreeNode convertBST(TreeNode root) {
if(root == null) return root;
convertBST(root.right);
if(pre != null){
sum = root.val + pre.val;
root.val = sum;
}
pre = root;
convertBST(root.left);
return root;
}
}
不用指针 右中左
中间节点直接求sum,赋值
class Solution {
//右中左
int sum = 0;
public TreeNode convertBST(TreeNode root) {
if(root == null) return root;
convertBST(root.right);
sum += root.val;
root.val = sum;
convertBST(root.left);
return root;
}
}