Day19 | 701删除二叉搜索树中的节点&669修剪二叉搜索树&108将有序数组转换为二叉搜索树&538把二叉搜索树转换为累加树

73 阅读2分钟

删除二叉搜索树中的节点 LeetCode 701

题目链接:[LeetCode 701 - 中等]

思路

五种情况: 1.找到了 左右子树都为空 2.找到了 左子树或者右子树其中有一个为空 3.找到了 左子树右子树均非空 4.没找到 根节点的val比key小 5.没找到 根节点的val比key大

其中该题最主要的代码为:

            TreeNode node = root.right;
            while(node.left!=null){
                node = node.left;
            }
            node.left = root.left;
            root = root.right;
            return root;

递归(使用二叉搜索树的特性):

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

修剪二叉搜索树 LeetCode 669

题目链接:[LeetCode 669 - 中等]

思路

该题使用递归的方式来解决会较为复杂。(思路复杂,代码简洁) 主要是考虑到二叉搜索树的特性 如果根节点的值大于high,那么其右子树中的右侧也不符合要求,那么去判断右子树中的左节点的大小,这边简单的去判断其右子树,如果小于low同理。

递归(使用二叉搜索树的特性):

class Solution {
    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;
    }
}

将有序数组转换为二叉搜索树 LeetCode 108

题目链接:[LeetCode 108 - 简单]

思路

主要是使用到了之前的int mid = begin +((end - begin)>>1);

递归:

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

把二叉搜索树转换为累加树 LeetCode 538

题目链接:[LeetCode 538 - 中等]

思路

根据题意得知:递归顺序 : 右中左

递归:

class Solution {
    int sum = 0;
    public TreeNode convertBST(TreeNode root) {
        if(root==null)return null;
        convertBST(root.right);
        sum += root.val;
        root.val = sum;
        convertBST(root.left);
        return root;
    }
}