669. 修剪二叉搜索树

在这里插入图片描述

这道题逻辑上要明白一点,那就是如果某个节点的值小于low,可以直接把该节点和左儿子抹掉;如果大于high,直接抹掉该root节点。
下面是我自己写的代码,思路很清晰,但是不够简洁

class Solution {
    int low = 0;
    int high = 0;

    public TreeNode trimBST(TreeNode root, int low, int high) {
        this.low = low;
        this.high = high;
        return inorder(root);
    }

    public TreeNode inorder(TreeNode root) {
        if (root == null) {
            return null;
        }
        if (root.val >= low && root.val <= high) {
            root.left= inorder(root.left);
            root.right = inorder(root.right);
        } else if (root.val <= low) {
            root.left = null;
            root.right = inorder(root.right);
            root = root.right;
        } else {
            root.right = null;
            root.left = inorder(root.left);
            root = root.left;
        }
        return root;
    }
}

下面是精解版,其实可以直接在trimBST中进行遍历查找,不需要用inorder方法。

class Solution {
    int low = 0;
    int high = 0;

    public TreeNode trimBST(TreeNode root, int low, int high) {
        this.low = low;
        this.high = high;
        root = inorder(root);
        return root;
    }

    public TreeNode inorder(TreeNode root) {
        if (root == null) {
            return null;
        }
        if (root.val < low) {
            return inorder(root.right);
        }
        if (root.val > high) {
            return inorder(root.left);
        }
        root.left = inorder(root.left);
        root.right = inorder(root.right);
        return root;
    }
}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页