Leetcode - Largest BST Subtree

My code:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    private class Result {
        int size;
        int min;
        int max;
        Result(int size, int min, int max) {
            this.size = size;
            this.min = min;
            this.max = max;
        }
    }
    
    private int maxNum = 0;
    public int largestBSTSubtree(TreeNode root) {
        if (root == null) {
            return 0;
        }
        
        helper(root);
        return maxNum;
    }
    
    private Result helper(TreeNode root) {
        if (root == null) {
            return new Result(0, Integer.MAX_VALUE, Integer.MIN_VALUE);
        }
        Result left = helper(root.left);
        Result right = helper(root.right);
        
        if (left.size == -1 || right.size == -1 || root.val < left.max || root.val > right.min) {
            return new Result(-1, 0, 0);
        }
        int size = left.size + 1 + right.size;
        maxNum = Math.max(maxNum, size);
        int min = (left.min == Integer.MAX_VALUE ? root.val : left.min);
        int max = (right.max == Integer.MIN_VALUE ? root.val : right.max);
        return new Result(size, min, max);
    }
}

reference:
https://discuss.leetcode.com/topic/36995/share-my-o-n-java-code-with-brief-explanation-and-comments

这道题目并没能自己写出来。。。
类似的想法是有的。就是从底到顶,backtracking
当时我怎么想的呢?然后放弃了。
我想的是返回一个二维数组,第一位表示size,第二位表示这棵树最大值。

后来发现对于右子树来说,我们还需要知道最小值。然后我就懒得继续想下去了。

后来看了答案,发现返回一个类,类里面也是三个值:
size
min
max

其实当时自己的想法就差一点了。
时间复杂度是 O(n)

然后这种自定义类,返回一个类的做法,的确比我返回一个三位数组好多了。

另外,当root == null的时候,处理的办法也是亮点。

min = Integer.MAX_VALUE;
max = Integer.MIN_VALUE;

所以如果是左子树为空,那么我们需要看他的最大值是否小于root.val
的确是小于的,没问题。
如果右子树为空,那么我们需要看他的最小值是否大于root.val,
的确是大于的,没问题。

题目里说,如果是 top - down的recursion,时间复杂度是:
O(n log n) 一直没想明白。

Anyway, Good luck, Richardo! -- 09/07/2016

你可能感兴趣的:(Leetcode - Largest BST Subtree)