FTPrep, 98 Validate Binary Search Tree

来源:互联网 发布:java语言的执行模式 编辑:程序博客网 时间:2024/06/06 04:20

这道题拿到手里,最直接的方法就是 inorder遍历,生成一个list,然后挨个检查看是不是增序排列。

思路是这样的,但是考虑到,可以在存表的时候就检查了两两相邻元素,而不需要全部存好再检查。再 进一步优化,其实不需要存整个list呀,因为如果所有相邻的两两元素都满足条件那就okay了。所以只需要一个 其他 变量来维护就okay了。

代码的套路,就是来自于 iterative inorder traversal,这是一个模版,在这个模版上微微一变,就可以了。

而且这个模版适用至少3题: 94,inorder traversal; 98, validate binary search tree; 230, K-th smallest element.( 哥uber实习第二面的题哦,哈哈,看来我当时做题还不够多,不过反应还可以做出来了)

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    public boolean isValidBST(TreeNode root) {        if(root==null) return true;        Stack<TreeNode> stack = new Stack<TreeNode>();        TreeNode pre = null;        // int preVal=Integer.MIN_VALUE;  事实证明这样是不过不了所有case的,卡住的case就是node.val==Integer.MIN_VALUE        // 所以还是把pre定义成 TreeNode, 初始值为null,这样就容易处理啦,加一个判断条件。        while(root!=null || !stack.isEmpty()){            if(root!=null){                stack.push(root);                root=root.left;            }else{                root=stack.pop();                if(pre!=null && pre.val>=root.val) return false;                pre=root;                root=root.right;            }        }        return true;    }}// 可以看出这道题的本质做法就是inorder遍历呀~哈哈,但是其实又不需要全部排开存到一个list,虽然我一开始最简单想法就是先存起来再遍历检查大小关系// 现在的话只需要有一个 变量 来维护之前的数,也就是stack.pop() 出来的数,这样空间上可以节约大量空间。

把230的代码先帖到这里,供对比:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    public int kthSmallest(TreeNode root, int k) {        int result=0;        int order=0;        if(root==null) return -1;        Stack<TreeNode> stack = new Stack<TreeNode>();        while(root!=null || !stack.isEmpty()){            if(root!=null){                stack.push(root);                root=root.left;            }            else{                root=stack.pop();                result=root.val;                order++;                if(order==k) return result;                root=root.right;            }        }        return result;    }}