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);
    }
}
posted @ 2018-11-14 08:52  子烁爱学习  阅读(207)  评论(0编辑  收藏  举报