二叉搜索树的判断

[TOC]


写在前面的话

  初刷leetcode心得,根据题目、定义思考解题方案,第一遍先做出可以运行的答案,第二遍再适当进行速度优化,第三遍看看最优的答案理解其思路。

 

  


题目内容

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

二叉搜索树的定义如下:

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

1. 解法1

1.1 解题思路

  根据二叉排序树的中序遍历性质,可知其中序遍历为递增有序序列,所以可以将遍历结果存在ArrayList中,再对ArrayList进行有序的判断,若无序则返回false。

  ················

1.2 java实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    private ArrayList treeList = new ArrayList();
    public boolean isValidBST(TreeNode root) {
        toList(root);
        boolean flag = true;
        /* for (int i = 0; i < treeList.size(); i++) {
            System.out.println(treeList.get(i));
        }*/

        //通过两个for循环进行有序性的判断
        for(int i=0;i<treeList.size();i++)
            for(int j=i+1;j<treeList.size();j++)
                if((int)treeList.get(i) >= (int)treeList.get(j))
                    flag = false;
        return flag;

    }

    //中序遍历存入treeList
    public void toList(TreeNode root){
        if(root!=null){
            toList(root.left);
            treeList.add(root.val);
            toList(root.right);
        }
    }

}

1.3 时间复杂度分析

  最终时间性能不尽人意,在双重for循环处耗时O(n2),可以考虑改进的判断有序算法。



              

2. 解法2

2.1 解题思路

  ·········

  ··········

2.2 java实现

/**
* 这是一段注释块
*
* 标记部分(block tags)
*/

2.3 时间复杂度分析

  ·········

  ·········


结语

原文地址:https://www.cnblogs.com/crazy123snail/p/9194974.html

时间: 2024-10-10 12:24:44

二叉搜索树的判断的相关文章

天梯 - 是否完全二叉搜索树(判断序列插完是否是完全二叉树,并求出层序遍历)

将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数N:第二行给出N个互不相同的正整数,其间以空格分隔. 输出格式: 将输入的N个正整数顺序插入一个初始为空的二叉搜索树.在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格.第二行输出YES,如果该树是完全二叉树:否则输出NO. 输入样例1: 9 38 45 42 24 5

二叉树遍历的应用(路径和问题,判断是否是二叉搜索树,判断是否是二叉平衡树)

现在越发觉得关于树的问题真是千变万化,随便改一个条件又会是一个新的问题. 先序遍历求二叉树路径问题 问题:一棵二叉树每个节点包含一个整数,请设计一个算法输出所有满足条件的路径:此路径上所有节点之和等于给定值.注意此类路径不要求必须从根节点开始. 如果没有最后一个条件,这道题在leetcode上面见过,就是采取先序遍历的方式并记录下路径.但是加上最后一个条件后需要转下弯思考一下. 当然也需要记录下路径,并且记得要回溯.加上不要求从根节点开始这个条件后可以这么思考,每次遍历到当前节点时,从路径中查找

判断一棵树是否是二叉搜索树

前两天写过一篇博文<二叉搜索树基本操作实现>,为了更深入了解二叉搜索树的性质,本文实现判断一棵树是否为二叉搜索树算法. 二叉搜索树的性质: 任意节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值. 构造二叉树的节点定义为: struct TreeNode{ int data; TreeNode *left; TreeNode *right; }; 方法1 (错误) 对每一个节点,检测其值是否大于左子树节点,是否小于右子树节点.思路很简单,代码实现如下: bool

二叉搜索树的后序遍历序列——24

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入数组的任意两个数组都互不相同. 二叉搜索树的特点就是每个结点的左子树的值都比自身的值小,而右子树的值都比自身值要大.比如如上的二叉搜索树后序遍历的结果就是{5,7,6,9,11,10,8},但是题意并不是给出一棵二叉搜索树让判断数组是否为后序遍历序列,而是只有一组数据让判断是否为某个二叉搜索树的后序遍历结果,因此之能依据二叉搜索树后序遍历结果的特点来进行分析判断: 就拿上面的结果来说

PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数N:第二行给出N个互不相同的正整数,其间以空格分隔. 输出格式: 将输入的N个正整数顺序插入一个初始为空的二叉搜索树.在第一行中输出结果树的层序

判断一个数组是否是二叉搜索树的后序遍历(java)

分析: 代码: package Tree; public class VerifyBST { //第一个元素下标low,最后一个元素下标high public static boolean verifySequenceBST(int[] sequence,int low,int high){ if(sequence == null || high-low <0){ return false; } int root = sequence[high]; int i; //在二叉搜索树左子数的结点小于

判断二叉搜索树的后序遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析:采用递归的思想,先找出根节点,左子树元素都必须比根节点小,右子树节点都比根节点大,否则返回false. 得到子树(子序列)的两种方法: ①用下标把数组 逻辑分为几个子数组(这里采用的是这种) ②用工具类Arrays把数组分割 public class Solution {    public boolean VerifySquenceOfBST(int

判断数组是否为某二叉搜索树的后序遍历

1 /************************************************************************* 2 > File Name: 22_SequenceOfBST.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月30日 星期二 20时34分33秒 6 ***********************************

20,判断是不是二叉搜索树的后序遍历《剑指offer》

题目: 给定一个序列,判断是不是二叉搜索树的后序遍历 思路: 递归版: 一个正确的后序遍历可以分为三段来看: 1:最后一个值是根节点   2:左子树节点(都比根节点值小) 3:右子树节点(都比根节点大) 且满足左子树个数加右子树个数等于N-1:(N为后序遍历的节点总个数) 左子树和右子树又可以进行同样的操作,,,perfect的递归定义哈 然后判断出口: 1,正确的出口,子树只有一个元素或者零个元素(这零就是为什么要多写一个函数的原因了..) 2,错误的出口,左子树加上右子树的个数不等于N-1