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 }
  • 相关阅读:
    Hbase 性能改进
    HBase总结(十一)hbase Java API 介绍及使用示例
    Java中如何遍历Map对象的4种方法
    Jsp分页实例---假分页
    Jsp分页实例---真分页
    Java正则表达式
    平均时间复杂度为O(nlogn)的排序算法
    常见排序算法--简单排序
    [kuangbin带你飞]专题一 简单搜索
    [kuangbin带你飞]专题一 简单搜索
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/9827261.html
Copyright © 2011-2022 走看看