669. 修剪二叉搜索树
从根节点向下遍历二叉搜索树,找到不是[low,high]范围内的节点就删除节点
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if(root == null){
return null;
}
if(root.val > high) {//[low,high]都在左子树上
return trimBST(root.left, low, high);
}else if(root.val < low) {//[low,high]都在右子树上
return trimBST(root.right, low, high);
}else {
root.left = trimBST(root.left, low, high);
root.right = trimBST(root.right, low, high);
return root;
}
}
}
——————————————————————————————————————————
108. 将有序数组转换为二叉搜索树
要转换为一棵 平衡 二叉搜索树,需要根节点的左右子树的最大深度差不超过1
那么就将nums数组平分为两组,分别组成左右子树
后序遍历构建二叉树
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return sortedArrayToBSTFunc(nums, 0, nums.length);
}
//左闭右开
private TreeNode sortedArrayToBSTFunc(int[] nums, int start, int end) {
if(end - start < 1){
return null;
}
int rootIndex = (start + end) / 2;
TreeNode root = new TreeNode(nums[rootIndex]);
root.left = sortedArrayToBSTFunc(nums, start, rootIndex);
root.right = sortedArrayToBSTFunc(nums, rootIndex + 1, end);
return root;
}
}
——————————————————————————————————————————
538. 把二叉搜索树转换为累加树
右中左的遍历顺序
记录上个遍历的节点的值,当前节点的值改为当前节点的值加上上一个节点的值
class Solution {
TreeNode pre;
public TreeNode convertBST(TreeNode root) {
convertBSTFunc(root);
return root;
}
public void convertBSTFunc(TreeNode root) {
if(root == null){
return;
}
convertBST(root.right);
if(pre != null){
root.val += pre.val;
}
pre = root;
convertBST(root.left);
}
}