目录
669 修剪二叉搜索树
在递归函数中对当前节点进行判断,有如下四种情况:
- 如果节点为空,则返回空
- 如果节点的值小于low,说明该节点需要被移除且根据二叉搜索树性质,我们应在该节点的右子树中寻找合适的节点
- 如果节点的值大于于high,说明该节点需要被移除且根据二叉搜索树性质,我们应在该节点的左子树中寻找合适的节点。
- 如果不在上述情况中,说明该节点不用被移除,继续递归寻找该节点的左节点和右节点。
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);
if(root.val > high)return trimBST(root.left,low,high);
//此节点的值在[low,high]区间内
root.left = trimBST(root.left,low,high);
root.right = trimBST(root.right,low,high);
return root;
}
}
时间复杂度O(n)
空间复杂度O(n)
108 将有序数组转换为二叉搜索树
依照题意,我们需要将数组转化为一颗高度平衡的二叉搜索树(二叉树每个节点的左右两个子树的高度差的绝对值不超过1),并且由于是有序数组,所以我们从中间开始转换,划分左右数组,递归创建左子树和右子树。
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return BSTBuildHelper(nums,0,nums.length);
}
private TreeNode BSTBuildHelper(int[] nums,int l,int r){//左闭右开
if(l >= r)return null;
int mid = (r - l) / 2 + l;
TreeNode cur = new TreeNode(nums[mid]);
cur.left = BSTBuildHelper(nums,l,mid);
cur.right = BSTBuildHelper(nums,mid + 1,r);
return cur;
}
}
时间复杂度O(n)
空间复杂度O(logn)为栈的深度,且构建的是高度平衡二叉树
538 把二叉搜索树转换为累加树
由于该树为二叉搜索树,累加树节点的新值应该为该节点原来右子树原值总和,所以可以通过反序中序遍历的方式从树的右叶子结点开始用sum记录所有节点值的和,并赋值给新树中的节点。
class Solution {
int sum = 0;
public TreeNode convertBST(TreeNode root) {
BSThelper(root);
return root;
}
private void BSThelper(TreeNode cur){//按照右中左的顺序依次递归
if(cur == null)return;
BSThelper(cur.right);
sum += cur.val;
cur.val = sum;
convertBST(cur.left);
}
}
时间复杂度O(n)
空间复杂度O(n)