找到二叉树中的最大搜索二叉子树

哈哈~~
如果看过 上篇 递归中的一些容易忽略的小细节的盆友,脑暴你的还有哦。。。。
如题:给定一颗二叉树的头节点head,已知其中所有节点的值都不一样,找到含有节点最多的搜索二叉子树,并返回这颗子树的头节点。

本来,按照我非常简易的解题思路是,从根节点找起(顺着来)。
1.编写一个可以判断 该二叉树 是不是 搜索二叉树的函数,并返回 flag (用来表示是否为搜索二叉树),外加返回 总共包含多少个节点。
2.将这颗树,从根节点开始,以此 调用 步骤1。
3.然后 找到是搜索二叉树就,且节点最多的,结束。

思路应该没错,但是 步骤2 可能有很多重复查找的多余步骤。所以,我就查看了 左程云 的解法。

后序遍历,底部节点往上卷,用了数组,赋值 再 赋值,是的,我没有打错。绕上去。
看代码。。。

 public class Node {
        public int val;
        public Node left;
        public Node right;

        public Node(int data) {
            this.val = data;
        }
    }
    public Node biggestSubBST(Node head){
        int[] record= new int[3];
        return posOrder(record,head);
    }
    public Node posOrder(int[] record,Node head){
        if(head ==null){
            record[0]=0;
            record[1]=Integer.MAX_VALUE;
            record[2]=Integer.MIN_VALUE;
            return null;
        }
        int value=head.val;
        Node left=head.left;
        Node right=head.right;
        Node lnod=posOrder(record,left);
        int lsize=record[0];
        int lmin=record[1];
        int lmax=record[2];
        Node rnod=posOrder(record,right);
        int rsize = record[0];
        int rmin=record[1];
        int rmax=record[2];
        //注释1:点睛之笔
        record[1]=Math.min(lmin,value);
        record[2]=Math.max(rmax,value);
        //注释2:搜索二叉树的标志,比左节点大,比右节点小。讲的更严谨一点,比左节点 最大的 大,比右节点 最小的 小。
        if(left==lnod && right==rnod && lmax<value && value <rmin){
            record[0]=lsize+rsize+1;
            return head;
        }
        record[0]=Math.max(lsize,rsize);
        return lsize>rsize?lnod:rnod;
    }

我在复写的时候 在注释2处 出错,仔细想了想,是自己 疏忽了 再次强调的话语。
注释1.真的是 点睛之笔,想到这里的灵活运用 算的上真正的了解的递归 以及 赋值 再赋值了。哈~~end

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值