zoukankan      html  css  js  c++  java
  • 判断一棵二叉树是否为二叉搜索树

    答案转载自:https://www.2cto.com/kf/201506/408372.html

    裁判测试程序样例:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef enum { false, true } bool;
    typedef int ElementType;
    typedef struct TNode *Position;
    typedef Position BinTree;
    struct TNode{
        ElementType Data;
        BinTree Left;
        BinTree Right;
    };
    
    BinTree BuildTree(); /* 由裁判实现,细节不表 */
    bool IsBST ( BinTree T );
    
    int main()
    {
        BinTree T;
    
        T = BuildTree();
        if ( IsBST(T) ) printf("Yes
    ");
        else printf("No
    ");
    
        return 0;
    }
    /* 你的代码将被嵌在这里 */

     错误解法:

     1 bool isBST(Node* node)
     2 {
     3   if (node == NULL)
     4     return true;
     5       
     6   //如果左孩子大于根节点,则不是BST
     7   if (node->left != NULL && node->left->key> node->key)
     8     return false;
     9       
    10   //如果右孩子节点小于根节点,则不是BST
    11   if (node->right != NULL && node->right->key < node->key)
    12     return false;
    13     
    14   //递归的判断
    15   if (!isBST(node->left) || !isBST(node->right))
    16     return false;
    17       
    18   //检测完毕,所有条件通过,则是BST
    19   return true;
    20 }

    这种判断方法是错误的,如下面例子所示,节点4处于根节点3的左子树中,但是函数检测到这棵树是BST.

    正确解法:

     1 //判断是否为BST
     2 bool IsBST(BinTree T)
     3 {
     4         return(isBSTUtil( T, -10000, 10000));
     5 }
     6 
     7 //如果是一颗二叉查找树,且值范围在[min, max],则返回true
     8 bool isBSTUtil(BinTree T , int min , int max )
     9 {
    10         //空树也是BST
    11         if ( T == NULL)
    12                return true;
    13 
    14         //如果节点值违反了最大/最小约束条件,则不是BST
    15         if ( T->Data < min || T->Data > max)
    16                return false;
    17 
    18         //递归检查子树
    19         return  isBSTUtil( T->Left, min, T->Data - 1) &&
    20               isBSTUtil( T->Right, T->Data + 1, max);
    21 }
  • 相关阅读:
    Java:抽象类与接口
    OOP编程思想:类的设计原则
    Win10系统下设置Go环境变量和go语言开启go module
    Windows下Golang安装Iris框架
    AOS.JS 和基于Animation.css的收费库WOW.JS相似
    文本比价工具
    MySQL Order By Rand()效率
    datatable分页
    PHP面向对象之魔术方法
    PHP面向对象之序列化与反序列化
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/9827261.html
Copyright © 2011-2022 走看看