目录
在递归函数中对当前节点进行判断,有如下四种情况:
- 如果节点为空,则返回空
- 如果节点的值小于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)
依照题意,我们需要将数组转化为一颗高度平衡的二叉搜索树(二叉树每个节点的左右两个子树的高度差的绝对值不超过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)为栈的深度,且构建的是高度平衡二叉树