669. 修剪二叉搜索树
这一题的解题关键是,不需要重构二叉树,只需要按照规则删除节点就可。
思路如下
lass 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;
}
}
108. 将有序数组转换为二叉搜索树
这题的解题关键在于左右区间的划分,这里采用的时左闭右闭的原则。
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if(nums.length == 0) return null;
// 左闭右闭
return buildHelper(nums, 0, nums.length -1);
}
public TreeNode buildHelper(int[] nums, int left, int right){
if(left > right) return null;
// 中
int mid = (left + right)/2;
TreeNode root = new TreeNode(nums[mid]);
// 左
root.left = buildHelper(nums,left, mid -1);
// 右
root.right = buildHelper(nums, mid+1, right);
return root;
}
}
538. 把二叉搜索树转换为累加树
Step1: 确定遍历顺序 右中左
Step2: 确定方法为双指针法
class Solution {
int pre = 0;
public TreeNode convertBST(TreeNode root) {
covertHelper(root);
return root;
}
public void covertHelper(TreeNode cur){
if(cur == null) return;
// 右
covertHelper(cur.right);
// 中
cur.val += pre;
pre = cur.val;
// 左
covertHelper(cur.left);
}
}
总结
链接: 二叉树总结