LeetCode 669. 修剪二叉搜索树
思路:遇到不符合条件的节点,对其采用和LeetCode450一样的思路进行删除,将两个条件放在一起判断虽然也能通过,但是这种思路会增加递归的复杂度,会做许多无意义的遍历,例如当root.val<low时,即使左子树不为空,也不需要再遍历,因为左子树必然小于root.val;同理,当root.val>high时,右子树是不需要再遍历的,所以需要将这两种情况分开处理。
原始思路代码:
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if(root == null) return root;
if(root.val < low || root.val > high) {
if(root.left == null && root.right != null) return trimBST(root.right, low, high);
if(root.left != null && root.right != null) {
TreeNode leftest = transerval(root.right);
leftest.left = root.left;
return trimBST(root.right, low, high);
}
return trimBST(root.left, low, high);
}
root.left = trimBST(root.left, low, high);
root.right = trimBST(root.right, low, high);
return root;
}
public TreeNode transerval(TreeNode node) {
if(node.left == null) return node;
return transerval(node.left);
}
}
优化后代码如下:
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if(root == null) return root;
if(root.val < low) {
// 说明当前节点和左子树都不满足[low,hight];
TreeNode right = trimBST(root.right, low, high);
return right;
}
if(root.val > high) {
// 说明当前节点和右子树都不满足[low,hight];
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;
}
}
LeetCode 108.将有序数组转换为二叉搜索树
由于题目要求要将一个有序数组nums转换为一个高度平衡的二叉搜索树,不难想到通过取中点来构造树,这里我才用的区间是左闭右开,后面递归也一直坚持左闭右开。当start == end时,说明该区间内没有节点了,应返回空节点,否则取中点作为当前节点,并递归构造左子树和右子树。这样得到的树便是高度平衡的。代码如下:
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return transerval(nums, 0, nums.length);
}
public TreeNode transerval(int[] nums, int start, int end) {
if(start == end) return null;
int index = start + (end - start) / 2;
TreeNode node = new TreeNode(nums[index]);
node.left = transerval(nums, start, index);
node.right = transerval(nums, index + 1, end);
return node;
}
}
LeetCode 538.把二叉搜索树转换为累加树
本题不难想到右中左来遍历二叉搜索树,记录下前一个节点的值,与当前节点的值相加,便可得到累加树,代码如下:
class Solution {
int pre = 0;
public TreeNode convertBST(TreeNode root) {
transerval(root);
return root;
}
public void transerval(TreeNode node) {
if(node == null) return ;
transerval(node.right);
node.val += pre;
pre = node.val;
transerval(node.left);
}
}