判断给定的二叉树是否为二叉排序树

来源:互联网 发布:nginx反向代理apache 编辑:程序博客网 时间:2024/06/04 19:44

这是CSDN博主Hackbuteer1的文章!学习一下。


思路:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉排序树。

递归遍历就可以了,反正就是左孩子的key比根节点的key小,右孩子的key比根节点的key大,一旦有不满足条件的就判定不是。

完整的代码如下:

[cpp] view plaincopy
  1. #include "stdio.h"  
  2. #include "stdlib.h"  
  3. typedef struct node  
  4. {  
  5.     int data;  
  6.     struct node *lchild,*rchild;  
  7. }Bitree;  
  8. Bitree *B[100];  
  9. Bitree *CreateBiTree()  
  10. {  
  11.     int num,i,n;  
  12.     Bitree *t,*s;  
  13.     t=NULL;  
  14.     printf("建立二叉树(1表示为虚结点,0表示输入结束):/n");  
  15.     num=0;  
  16.     scanf("%d",&n);  
  17.     while(n!=0)  
  18.     {  
  19.         s=(Bitree *)malloc(sizeof(Bitree));  
  20.         s->data=n;  
  21.         s->lchild=s->rchild=NULL;  
  22.         num++;  
  23.         if(!t)  
  24.             t=s;  
  25.         B[num]=s;  
  26.         scanf("%d",&n);  
  27.     }  
  28.     for(i=1;i<=num;i++)  
  29.     {  
  30.         if(B[i]->data!=1)  
  31.         {  
  32.             if(2*i<=num && B[2*i]->data!=1)  
  33.                 B[i]->lchild=B[2*i];  
  34.             if(2*i+1<=num && B[2*i+1]->data!=1)  
  35.                 B[i]->rchild=B[2*i+1];  
  36.         }  
  37.     }  
  38.     return t;  
  39. }  
  40. int IsSearchTree(const Bitree *t)  //递归遍历二叉树是否为二叉排序树  
  41. {  
  42.     if(!t)        //空二叉树情况  
  43.         return 1;  
  44.     else if(!(t->lchild) && !(t->rchild))   //左右子树都无情况  
  45.         return 1;  
  46.     else if((t->lchild) && !(t->rchild))    //只有左子树情况  
  47.     {  
  48.         if(t->lchild->data>t->data)  
  49.             return 0;  
  50.         else  
  51.             return IsSearchTree(t->lchild);  
  52.     }  
  53.     else if((t->rchild) && !(t->lchild))   //只有右子树情况  
  54.     {  
  55.         if(t->rchild->data<t->data)  
  56.             return 0;  
  57.         else  
  58.             return IsSearchTree(t->rchild);  
  59.     }  
  60.     else         //左右子树全有情况  
  61.     {                                  
  62.         if((t->lchild->data>t->data) || (t->rchild->data<t->data))  
  63.             return 0;  
  64.         else  
  65.             return ( IsSearchTree(t->lchild) && IsSearchTree(t->rchild) );  
  66.     }  
  67. }  
  68. int main(void)  
  69. {  
  70.     int flag=0;  
  71.     Bitree *tree;  
  72.     tree=CreateBiTree();  
  73.     flag=IsSearchTree(tree);  
  74.     if(flag)  
  75.         printf("这棵树是二叉排序树!/n");  
  76.     else  
  77.         printf("这棵树不是二叉排序树!/n");  
  78.     system("pause");  
  79.     return 0;  
  80. }  

 

 


原创粉丝点击