力扣爆刷第144天之二叉树四连刷(完结二叉搜索树改变树结构)

力扣爆刷第144天之二叉树五连刷(二叉搜索树)

一、450. 删除二叉搜索树中的节点

题目链接:https://leetcode.cn/problems/delete-node-in-a-bst/description/
思路:删除二叉搜索树中的节点,这种改变树结构类型的题目,一定都是在树的遍历过程中,构造树,这个是一个解题的模板,也就是递归函数的返回值要作为父节点的左孩子或者右孩子。本题直接从上往下搜索,一旦搜索到,有两种解题方案,一种是找到左子树的最大值或者右子树的最小值,找到后替换子树的链接,然后作为root返回。注意边界条件控制。

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root == null) return null;
        if(root.val > key) {
            root.left = deleteNode(root.left, key);
        }else if(root.val < key) {
            root.right = deleteNode(root.right, key);
        }else{
            if(root.left == null) return root.right;
            TreeNode p = root.left;
            TreeNode pro = p;
            while(p.right != null) {
                pro = p;
                p = p.right;
            }
            if(pro != p) {
                pro.right = p.left;
                p.left = root.left;
                p.right = root.right;
            }else{
                p.right = root.right;
            }
            return p;
        }
        return root;
    }
}

二、669. 修剪二叉搜索树

题目链接:https://leetcode.cn/problems/trim-a-binary-search-tree/description/
思路:和上一题类似,不过简单那很多,只需要递归遍历搜索到边界条件处即可停止。在遍历的过程中构建树,如果当前节点不在范围内,则直接返回子树结果(就是在结果树中剔除了当前节点),如果当前结果在范围内,则构建树,即用root的左右孩子接收递归寻找结果。

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);
        }else if(root.val < low) {
            return trimBST(root.right, low, high);
        }else {
            root.left = trimBST(root.left, low, high);
            root.right = trimBST(root.right, low, high);
            return root;
        }
    }
}

三、108. 将有序数组转换为二叉搜索树

题目链接:https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/
思路:通过有序数组构建平衡二叉搜索树,只需要采用二分查找的方法来构建二叉树,构建处来的一定是平衡二叉搜素树。

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return buildTree(nums, 0, nums.length-1);
    }
    TreeNode buildTree(int[] nums, int left, int right) {
        if(left > right) return null;
        int mid = left + (right - left)/2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = buildTree(nums, left, mid-1);
        root.right = buildTree(nums, mid+1, right);
        return root;
    }
}

四、538. 把二叉搜索树转换为累加树

题目链接:https://leetcode.cn/problems/convert-bst-to-greater-tree/description/
思路:让把二叉搜索树改成累加树,累加树的要求是新节点为原节点加上比它大的所有节点,所以利用中序遍历的特性,采用右,中,左的方式进行遍历累加即可。

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);
        root.val += sum;
        sum = root.val;
        traverse(root.left);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

当年拼却醉颜红

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值