669. 修剪二叉搜索树
参考文章:代码随想录
参考视频:你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树_哔哩哔哩_bilibili
解题思路:利用二叉搜索树的特性来解决此题,如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。接下来要将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。
public TreeNode trimBST(TreeNode root, int low, int high) {
if (root == null) return root;
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.将有序数组转换为二叉搜索树
参考文章:代码随想录
参考视频:构造平衡二叉搜索树!| LeetCode:108.将有序数组转换为二叉搜索树_哔哩哔哩_bilibili
解题思路:确定数组的中间节点作为根节点,左子树为更节点左边数组,右子树为右边的右边数组,当数组为0时返回null,当数组大小为1时则返回一个新的节点,值为这个数组的值。注意数组的切割,这里用的是左闭右开的写法。
public TreeNode sortedArrayToBST(int[] nums) {
return build(nums);
}
public TreeNode build(int[] nums) {
if (nums.length == 0) return null;
if (nums.length == 1) return new TreeNode(nums[0]);
int index = nums.length / 2;
TreeNode root = new TreeNode(nums[index]);
int[] pre = Arrays.copyOfRange(nums, 0, index);
int[] post = Arrays.copyOfRange(nums, index + 1, nums.length);
root.left = build(pre);
root.right = build(post);
return root;
}
538.把二叉搜索树转换为累加树
参考文章:代码随想录
参考视频:普大喜奔!二叉树章节已全部更完啦!| LeetCode:538.把二叉搜索树转换为累加树_哔哩哔哩_bilibili
解题思路:本体可以看到数组从后往前是依次累加递增的,所以我们可以采用右中左的遍历方式来来遍历这个二叉树,需要用到两个指针,一个指向节点,一个指向节点的上一个节点pre=0,每次节点node+=pre,然后pre=node获取当前节点的值,当遇到空节点的时候即终止。
public class Leetcode538 {
int pre = 0;
public TreeNode convertBST(TreeNode root) {
add(root);
return root;
}
public void add(TreeNode node) {
if (node == null) return;
convertBST(node.right);
node.val += pre;
pre = node.val;
convertBST(node.left);
}
}