leetCode-验证二叉树搜索

题目地址:验证二叉树搜索

解题思路一

本文解题思路来自左程云老师算法课新手班第七节

二叉树的左节点小于根节点,右节点大于根节点,只需要判断,中序遍历是否严格递增即可。

比如示例一,其中序遍历为123,严格递增,也就是搜索二叉树

示例二:

其中序遍历为1 5 3 4 6,不是严格递增,所以不是搜索二叉树

中序遍历如何获得,之前说过,如有遗忘,请移步

那么现在有一个二叉树中序遍历的链表或者数组,此处使用链表最好。因为并不清楚有多少节点,数组的扩容相对耗时

如何去判断其是否为严格递增呢?

因为数据量并不大,最多只有104的节点。所以可以遍历判断,两两比较。

其中较为关键是,获取当前节点的值使用get方法,循环中size要减一,否则会超范围,还有必须加等号不然会出现这种情况了。

        int size = list.size();
        for (int i = 0; i <size-1 ; i++) {
            if (list.get(i)>=list.get(i+1)) {
                return false;
            }
        }

解题思路一 完整代码

    List<Integer> list = new LinkedList<>();
    public  void getList(TreeNode root){
        if (root == null) {
            return;
        }
        getList(root.left);
        list.add(root.val);
        getList(root.right);
    }
    public boolean isValidBST(TreeNode root) {
        if (root == null) {
            return true;
        }
        getList(root);
        int size = list.size();
        for (int i = 0; i <size-1 ; i++) {
            if (list.get(i)>=list.get(i+1)) {
                return false;
            }
        }
        return true;
    }

解题思路二

本文解题思路来自左程云老师算法课新手班第七节

使用递归的思想,一个节点的是否搜索,取决于,它的左树是否搜索,它的右树是否搜索,已经这个节点是否满足大于左树最大,小于右树最小

那么递归是需要返回一致的信息,那么就创建一个类用于返回,类里面包括是boolean的是否搜索,

两个int,一个最大值,一个最小值

    public class info {
        boolean isBST;
        int max;
        int min;

        public info(boolean isBST, int max, int min) {
            this.isBST = isBST;
            this.max = max;
            this.min = min;
        }
    }

接下来就是递归,如果这个节点是空,那么一定是搜索的,最大最小值不管赋予啥都有反例。

所以直接全部返回空

if (root == null) {
    return null;
}

接下来递归去抓住左右的信息

info leftinfo = process(root.left);
info rightinfo = process(root.right);

然后加工这个节点的信息,首先是min和max,先假设该节点就是最大或者最小,如果左右节点不为空,那么就会有该节点的左右信息,去和里面的最大最小进行一次选择。确定这个节点的最大和最小

        int max = root.val;
        int min = root.val;
        if (leftinfo != null) {
            max = Math.max(leftinfo.max, max);
            min = Math.min(leftinfo.min, min);
        }
        if (rightinfo != null) {
            max = Math.max(rightinfo.max, max);
            min = Math.min(rightinfo.min, min);
        }

接下来是IsBST的加工,首先假设它为true,这个节点为true的条件是左树为true,右树为true,同时左树最大小于节点值,节点值小于右树最小。

那么,很好理解,代码如下

        boolean IsBST = true;
        if (leftinfo != null && !leftinfo.isBST) {
            IsBST = false;
        }
        if (rightinfo != null && !rightinfo.isBST) {
            IsBST = false;
        }
        boolean leftMaxLessX = leftinfo == null ? true : leftinfo.max < root.val;
        boolean rightMinMoreX = rightinfo == null ? true : (rightinfo.min > root.val);
        if (!(leftMaxLessX && rightMinMoreX)) {
            IsBST = false;
        }

解题思路二 完整代码

    public class info {
        boolean isBST;
        int max;
        int min;

        public info(boolean isBST, int max, int min) {
            this.isBST = isBST;
            this.max = max;
            this.min = min;
        }
    }

    public info process(TreeNode root) {
        if (root == null) {
            return null;
        }
        info leftinfo = process(root.left);
        info rightinfo = process(root.right);

        int max = root.val;
        int min = root.val;
        if (leftinfo != null) {
            max = Math.max(leftinfo.max, max);
            min = Math.min(leftinfo.min, min);
        }
        if (rightinfo != null) {
            max = Math.max(rightinfo.max, max);
            min = Math.min(rightinfo.min, min);
        }
        boolean IsBST = true;
        if (leftinfo != null && !leftinfo.isBST) {
            IsBST = false;
        }
        if (rightinfo != null && !rightinfo.isBST) {
            IsBST = false;
        }
        boolean leftMaxLessX = leftinfo == null ? true : leftinfo.max < root.val;
        boolean rightMinMoreX = rightinfo == null ? true : (rightinfo.min > root.val);
        if (!(leftMaxLessX && rightMinMoreX)) {
            IsBST = false;
        }
        return new info(IsBST, max, min);
    }

    public boolean isValidBST(TreeNode root) {

        return process(root).isBST;
    }
版权声明:除特殊说明,博客文章均为栋dong原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。
如有需要,请在留言板留言,或者添加我的QQ或者微信
我只是一个学生,如有错误或者侵权,请联系我,谢!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇