669 修剪二叉搜索树
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);
//修剪完成,返回修剪后的左右子树:
root.left = trimBST(root.left, low, high);
root.right = trimBST(root.right, low, high);
return root;
}
}
108 将有序数组转换为二叉搜索树
有序数据都可以构造一个链式二叉树,如图中右边所示:
数组长度为奇数时,中间节点可以直接取
数组长度为偶数时,中间节点取左边或右边都可以,以-10和-3为例,取左边的-10,那-10的右节点为-3;取右边的-3,那-3的左节点为-10,都符合二叉搜索树的条件。
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
TreeNode root = travel(nums, 0, nums.length - 1);
return root;
}
public TreeNode travel(int[] nums, int left, int right) {
//对区间的定义要清楚,这个区间的定义为左闭右闭
if (left > right) return null;
int mid = (left + right) >> 1;
TreeNode root = new TreeNode(nums[mid]);
root.left = travel(nums, left, mid - 1);
root.right = travel(nums, mid + 1, right);
return root;
}
}
538 把二叉搜索树转换为累加树
中序遍历(左中右)会得到一个递增的序列,如果使用(右中左)则会得到一个递减的序列。
class Solution {
int pre = 0;
public TreeNode convertBST(TreeNode root) {
travel(root);
return root;
}
public void travel(TreeNode cur) {
if (cur == null) return;
travel(cur.right);
cur.val += pre;
pre = cur.val;
travel(cur.left);
}
}