zoukankan      html  css  js  c++  java
  • LeetCode:验证二叉搜索树【98】

    LeetCode:验证二叉搜索树【98】

    题目描述

    给定一个二叉树,判断其是否是一个有效的二叉搜索树。

    假设一个二叉搜索树具有如下特征:

    • 节点的左子树只包含小于当前节点的数。
    • 节点的右子树只包含大于当前节点的数。
    • 所有左子树和右子树自身必须也是二叉搜索树。

    示例 1:

    输入:
        2
       / 
      1   3
    输出: true
    

    示例 2:

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

    题目分析

      二叉搜索树的中序遍历结果递增。我们只需要写一个中序遍历然后看一下结果是否递增即可。

      其实我们也不需要把中序遍历结果全部弄出来,我们可以在递归的过程中,实时地比较当前元素和前一个元素的大小值关系,如果出现小于等于,则不是搜索树

        我们来分析一下二叉树中序遍历的迭代算法:

    class Solution {
        public List<Integer> inorderTraversal(TreeNode node) {
            List<Integer> ans = new ArrayList<>();
            if(node==null)
                return ans;
            Stack<TreeNode> stack = new Stack<>();
            while (node!=null||!stack.empty())
            {
                while (node!=null) {    //while不成立时,到达最左下节点
                    stack.push(node);
                    node = node.left;
                }
                if (!stack.empty())
                {
                    TreeNode tmp = stack.pop();
                    ans.add(tmp.val);    //出栈并访问该节点
                    node = tmp.right;
                }
            }
            return ans;
        }
    }

      先一直沿着“左孩子方向”不断地走,当走到了最左下结点时(while不成立),准备出栈,访问该结点。当出栈访问完该结点之后,切换到该结点的右孩子的“子树”中,回到大循环,与前面一样,继续对该“子树”先沿着“左孩子方向”不断地走....

    Java题解

    /**
     * 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) {
            List<Integer> list = new ArrayList<>();
            inorder(root,list);
            for(int i=0;i<list.size()-1;i++)
                if(list.get(i)>=list.get(i+1))
                    return false;
            return true;
        }
    
        public void inorder(TreeNode node,List<Integer> list)
        {
            if(node==null)
                return;
            inorder(node.left,list);
            list.add(node.val);
            inorder(node.right,list);
        }
    }
  • 相关阅读:
    信息化与信息系统4
    信息化与信息系统3
    信息化与信息系统2
    信息化与信息系统1
    ASP.NET Core教程:ASP.NET Core 程序部署到Windows系统
    C#几种单例模式
    SQL查询优化
    动态类型dynamic(ExpandoObject)
    PV(访问量)、UV(独立访客)、IP(独立IP)
    Spring Boot 2.配置
  • 原文地址:https://www.cnblogs.com/MrSaver/p/9956067.html
Copyright © 2011-2022 走看看