LeetCode 669. 修剪二叉搜索树
题目链接:https://leetcode.cn/problems/trim-a-binary-search-tree/description/
文章链接:https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html
思路
- 思路:递归遍历二叉树
- 若遇见root.val<low,说明root的左子树的值均小于low,都不符合,则返回trimBST(root.right, low, high)
- 若遇见root.val>high,说明root的右子树的值均大于high,都不符合,则返回trimBST(root.left, low, high)
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;
}
LeetCode 108.将有序数组转换为二叉搜索树
题目链接:https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/
文章链接:https://programmercarl.com/0108.%E5%B0%86%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html
public TreeNode sortedArrayToBST(int[] nums) {
return traversal(nums, 0, nums.length - 1);
}
public TreeNode traversal(int[] nums, int left, int right) {
if (right < left)
return null;
int mid = (left + right) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = traversal(nums, left, mid - 1);
root.right = traversal(nums, mid + 1, right);
return root;
}
LeetCode 538.把二叉搜索树转换为累加树
题目链接:https://leetcode.cn/problems/convert-bst-to-greater-tree/description/
文章链接:https://programmercarl.com/0538.%E6%8A%8A%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E8%BD%AC%E6%8D%A2%E4%B8%BA%E7%B4%AF%E5%8A%A0%E6%A0%91.html
思路
- 可以将该树看成是一个自右向左从大向小排列的数组,然后进行累加即可,当前结点的值等于前面节点累加之和
- 因此二叉搜索树的右中左遍历可以满足数字自大向小排序。
private int pre = 0;
public TreeNode convertBST(TreeNode root) {
if (root == null)
return null;
convertBST(root.right);
root.val += pre;
pre = root.val;
convertBST(root.left);
return root;
}