LeetCode:98.验证二叉搜索树

1.要点

  • 搞清楚搜索二叉树和中序遍历的关系
  • 看看甜姨的递归(直接用答题的函数,一直往上return

2.题目

给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。

3.示例

  • 示例 1:
输入:
    2
   / \
  1   3
输出: true
  • 示例 2:
输入:
    5
   / \
  1   4
     / \
    3   6
输出: false
  • 解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。

4.甜姨的代码

class Solution {
    long pre = Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
        if (root == null) {
            return true;
        }
        // 访问左子树
        if (!isValidBST(root.left)) {
            return false;
        }
        // 访问当前节点:如果当前节点小于等于中序遍历的前一个节点,说明不满足BST,返回 false;否则继续遍历。
        if (root.val <= pre) {
            return false;
        }
        pre = root.val;
        // 访问右子树
        return isValidBST(root.right);
    }
}

5.自己的代码

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

        TreeNode(int x) {
            val = x;
        }
    }
    public class TreeNode1 {
        Integer val;
        TreeNode1 left;
        TreeNode1 right;
        TreeNode1 parent;
        Boolean isLeftChild;

        TreeNode1(int val,TreeNode1 parent,Boolean isLeftChild) {
            this.val = val;
            this.parent=parent;
            this.isLeftChild=isLeftChild;
        }
    }

    public boolean isValidBST(TreeNode root) {
        if(null == root){
            return true;
        }
        Stack<TreeNode> nodeStack = new Stack<>();
        Stack<TreeNode1> nodeStack1 = new Stack<>();
        nodeStack.push(root);
        nodeStack1.push(new TreeNode1(root.val,null,null));
        while (!nodeStack.isEmpty()){
            TreeNode node = nodeStack.pop();
            TreeNode1 node1 = nodeStack1.pop();
            if(!isSearchTree(node1,node1.val)){
                return false;
            }
            if (node.right!=null){
                nodeStack.push(node.right);
                node1.right=new TreeNode1(node.right.val,node1,false);
                nodeStack1.push(node1.right);
            }
            if(node.left!=null){
                nodeStack.push(node.left);
                node1.left=new TreeNode1(node.left.val,node1,true);
                nodeStack1.push(node1.left);
            }
        }
        return true;
    }

    public boolean isSearchTree(TreeNode1 node,int val){
        if(null== node.parent){
            return true;
        }
        if (node.isLeftChild){
            if(val<node.parent.val){
                return isSearchTree(node.parent,val);
            }
        }else{
            if(val>node.parent.val){
                return isSearchTree(node.parent,val);
            }
        }
        return false;
    }


查看原文:http://yuyy.info/%e7%ae%97%e6%b3%95%e8%ae%ad%e7%bb%83/leetcode98-%e9%aa%8c%e8%af%81%e4%ba%8c%e5%8f%89%e6%90%9c%e7%b4%a2%e6%a0%91/
posted @ 2020-06-26 16:31  Yuyy114  阅读(169)  评论(0编辑  收藏  举报