333.Largest BST Subtree

最大BST子树求解
本文介绍了一种自底向上的方法来解决寻找一棵二叉树中最大二叉搜索树子树的问题。通过递归地从左右子树收集信息,并在每个节点处决定是否构成有效的二叉搜索树来实现。

    /*
     * 333.Largest BST Subtree
     * 2016-3-27 by Mingyang
     * 这个题目我的思路,自底向上的方法非常正确的!但是,这个题目独特的一点就在于对于一个
     * Tree是不是BST得判断,他必须表示对左子树的最大的还大,右子树的最小的还要小,所以这样看来就是
     * 必须要保证root必须保存当前子树1.isBST?2.left smallest.3.right biggest.4.node number
     * 可以先建一个class,也可以做一个array
     */
      public int largestBSTSubtree(TreeNode root) {
            if( root == null ) return 0;
            int [] ret = dfs1( root );
            return ret[3];
        }
        private int[] dfs1( TreeNode node ) {
            int[] l = new int[]{ 1, node.val, node.val, 0 }; //isBst, min, max, numNodesBST
            int[] r = new int[]{ 1, node.val, node.val, 0 };
            if( node.left != null ) l = dfs1 ( node.left );
            if( node.right != null ) r = dfs1( node.right );
            boolean isBst = l[0] == 1 && r[0] == 1 && node.val >= l[2] && node.val <= r[1];
            int numBstNodes = isBst ? 1 + l[3] + r[3] : Math.max( l[3], r[3] );
            return new int[]{ isBst ? 1 : 0, l[1], r[2], numBstNodes };
        }  

 

转载于:https://www.cnblogs.com/zmyvszk/p/5658945.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值