刷题日记20
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 build(nums, 0, nums.length - 1);
}
public TreeNode build(int[] nums, int left, int right){
if(left > right) return null;
int mid = left + (right - left) / 2;
TreeNode node = new TreeNode(nums[mid]);
node.left = build(nums, left, mid - 1);
node.right = build(nums, mid + 1, right);
return node;
}
}
538. 把二叉搜索树转换为累加树
class Solution {
public int sum = 0;
public TreeNode convertBST(TreeNode root) {
traversal(root);
return root;
}
public void traversal(TreeNode root){
if(root == null) return;
convertBST(root.right);
sum += root.val;
root.val = sum;
convertBST(root.left);
}
}