669. 修剪二叉搜索树
题目链接:669. 修剪二叉搜索树
思路:
1、root.val < lo,这种情况下 root 节点本身和 root 的左子树全都是小于 lo 的,都需要被剪掉**。
2、root.val > hi,这种情况下 root 节点本身和 root 的右子树全都是大于 hi 的,都需要被剪掉**。
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if (root == null) return null;
if (root.val > high) {
return trimBST(root.left, low, high);
}
if (root.val < low) {
return trimBST(root.right, low, high);
}
root.left = trimBST(root.left, low, high);
root.right = trimBST(root.right, low, high);
return root;
}
}
总结:
108. 将有序数组转换为二叉搜索树
题目链接:108. 将有序数组转换为二叉搜索树
思路: 一个有序数组对于 BST 来说就是中序遍历结果,根节点在数组中心,数组左侧是左子树元素,右侧是右子树元素。
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return bulid(nums, 0, nums.length - 1);
}
TreeNode bulid(int[] nums, int l, int r) {
if (l > r) {
return null;
}
int mid = (l + r) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = bulid(nums, l, mid - 1);
root.right = bulid(nums, mid + 1, r);
return root;
}
}
总结:
538. 把二叉搜索树转换为累加树
题目链接:538. 把二叉搜索树转换为累加树
思路:
维护一个外部累加变量 sum,在遍历 BST 的过程中增加 sum,同时把 sum 赋值给 BST 中的每一个节点,就将 BST 转化成累加树了。
注意顺序,正常的中序遍历顺序是先左子树后右子树,这里需要反过来,先右子树后左子树。
class Solution {
int sum = 0;
public TreeNode convertBST(TreeNode root) {
traverse(root);
return root;
}
void traverse(TreeNode root) {
if (root == null) {
return;
}
traverse(root.right);
sum += root.val;
root.val = sum;
traverse(root.left);
}
}
总结: