98_验证二叉搜索树

98_验证二叉搜索树 

 

package 二叉树.二叉搜索树;

import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

/**
 * https://leetcode-cn.com/problems/validate-binary-search-tree/
 * 
 * @author Huangyujun
 *
 *       
 */
public class _98_验证二叉搜索树 {
    // (错误) 错误原因:这个代码只能保证局部父子节点关系为 左<中<右, 不能保证整棵树的左边所有节点都比根节点小,右边同理。
//    public boolean isValidBST(TreeNode root) {
//        if (root == null)
//            return false;
//        if (root.left == null && root.right == null) {
//            return true;
//        } else if (root.left == null) {
//            if (root.right.val <= root.val) {
//                return false;
//            }
//        } else if (root.right == null) {
//            if (root.left.val >= root.val) {
//                return false;
//            }
//        }
//        // 当前结点判断
//        return isValidBST(root.left) && isValidBST(root.right);
//    }
    
    /**
     * 官网是通过重载接口方法使用递归法,(参数:根,最小,最大)~ 实现了局部到整体都满足:
     * 二叉搜索树:根大于左子树,大于左边整棵树的最大值哦,同理,根小于右子树,小于右边整棵树的最小值。
     */
    class Solution {
        public boolean isValidBST(TreeNode root) {
            return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
        }

        public boolean isValidBST(TreeNode node, long lower, long upper) {
            if (node == null) {
                return true;
            }
            if (node.val <= lower || node.val >= upper) {
                return false;
            }
            return isValidBST(node.left, lower, node.val) && isValidBST(node.right, node.val, upper);
        }
    }
    //可以,但是不够优秀:
    //class Solution {
//        List<Integer> list = new ArrayList<>();
//        public boolean isValidBST(TreeNode root) {
//            if(root == null)     return true;
//            //思路二:中序拿到的元素(是否实现了从小到大)
//            int size = list.size();
//            for(int i = 0; i < size - 1; i++) {//验证是从小到大
//                if(list.get(i) >= list.get(i + 1)) {
//                    return false;
//                }
//            }
//            return true;
//        }
//        public void inorder(TreeNode root) {
//            if(root == null)    return;
//            inorder(root.left);
//            list.add(root.val);
//            inorder(root.right);
//        }
    //}


    /**
     * 官网遍厉二叉树的结点时,迭代写法:
     while (!stack.isEmpty() || node != null) {
        while (node != null) {
            stack.push(node);
            node = node.left;
        }
        // 即根
        node = stack.pop();
        。。。
     }             
     *  我的: (我的错误之处,在于开始: node = stack.pop(); 后面:node = stack.pop(); 这样写其实pop() 了两次)
            stack.push(root);
            while(!stack.isEmpty() ) {    
                node = stack.pop();
                while(node != null ) {    
                    node = node.left;
                    stack.push(node);
                }
                // 即根
                node = stack.pop();
                。。。
            }    
     */
    //中序遍历(迭代法/递归法)~ 从小到大啦(用一个变量记录前一次“第一次”,当前本次(第二次)与之对比)
    //这里的记录变量是:inorder
    class Solution2 {
        public boolean isValidBST(TreeNode root) {
            Deque<TreeNode> stack = new LinkedList<TreeNode>();
            double inorder = -Double.MAX_VALUE;
            TreeNode node = root;
            while (!stack.isEmpty() || node != null) {
                while (node != null) {
                    stack.push(node);
                    node = node.left;
                }
                // 即根
                node = stack.pop();
                // 如果中序遍历得到的节点的值小于等于前一个 inorder,说明不是二叉搜索树
                if (node.val <= inorder) {
                    return false;
                }
                inorder = node.val;
                // 判断该点
                node = node.right;
            }
            return true;
        }
    }
    
    
}

 

上一篇:阿里内部最新最全Java面试进阶手册,能横扫98%的面试官


下一篇:品质宣传看板-质量关注指标2