代码随想录算法训练营第二十三天| 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

文章介绍了如何使用递归方法处理二叉搜索树,包括修剪BST以保持在给定范围内,将有序数组转换为平衡的BST,以及将BST转换为累加树。关键在于理解二叉搜索树的性质并正确遍历节点。
摘要由CSDN通过智能技术生成

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);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值