一、669. 修剪二叉搜索树
与昨天的删除二叉搜索树特定节点很相似
通过代码对比我们发现对于左子树和右子树节点的递归处理不同:
即
root.left= trimBST(root.left,low,high) 和 return trimBST(root.left,low,high)的区别:
return的方法直接根节点和右子树都被去除 第一种则保留根节点
代码:
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if(root==null)
return null;
if(root.val<low){
return trimBST(root.right,low,high);
}else if(root.val>high){
return trimBST(root.left,low,high);
}else{
root.left=trimBST(root.left,low,high);
root.right=trimBST(root.right,low,high);
return root;
}
}
}
二、108.将有序数组转换为二叉搜索树
class Solution {
int[] nums;
public TreeNode sortedArrayToBST(int[] nums) {
this.nums=nums;
return helper(0,nums.length-1);
}
public TreeNode helper(int left, int right){
if(left>right){
return null;
}
int p=(left+(right-left)/2);
TreeNode root = new TreeNode(nums[p]);
root.left=helper(left,p-1);
root.right=helper(p+1,right);
return root;
}
}
538.把二叉搜索树转换为累加树
思路:
节点的值=本身+右子树值的和
代码:
class Solution {
int sum=0;
public TreeNode convertBST(TreeNode root) {
if(root==null){
return null;
}
convertBST(root.right);
sum=sum+root.val;
root.val=sum;
convertBST(root.left);
return root;
}
}