判断是否为二叉排序树
时间: 1ms 内存:128M
描述:
编写一个算法,判断给定二叉树是否为二叉排序树。
输入:
输入为该二叉树的层序遍历,输入0代表虚节点,输入-1结束。
编写一个算法,判断一个二叉树是否为二叉排序树。
二叉树节点的定义为
typedef struct node{int data;struct node *lchild;struct node *rchild;} Bitree;需要编写的算法为bool IsSearchTree(Bitree *t)若是,返回true,否则返回false。
输出:
输出为该二叉树是否为二叉排序树,若是,输出Yes,否则输出No。
示例输入:
50 34 89 23 42 63 90 -1
示例输出:
Yes
提示:
参考答案(内存最优[1776]):
#include "stdio.h"
#include "iostream"
using namespace std;
#include "stdlib.h"
typedef struct node
{
int data;
struct node *lchild;
struct node *rchild;
} Bitree;
Bitree *B[100];
Bitree *CreateBiTree()
{
int num,i,n;
Bitree *t,*s;
t=NULL;
num=0;
scanf("%d",&n);
while(n!=-1)
{
s=(Bitree *)malloc(sizeof(Bitree));
s->data=n;
s->lchild=s->rchild=NULL;
num++;
if(!t)t=s;
B[num]=s;
scanf("%d",&n);
}
for(i=1;i<=num;i++)
{
if(B[i]->data!=0)
{
if(2*i<=num && B[2*i]->data!=0)
B[i]->lchild=B[2*i];
if(2*i+1<=num && B[2*i+1]->data!=0)
B[i]->rchild=B[2*i+1];
}
}
return t;
}bool IsSearchTree(Bitree *t) //递归遍历二叉树是否为二叉排序树
{
if(!t) //空二叉树情况
return true;
else if(!(t->lchild) && !(t->rchild)) //左右子树都无情况
return true;
else if((t->lchild) && !(t->rchild)) //只有左子树情况
{
if(t->lchild->data>t->data)
return false;
else
return IsSearchTree(t->lchild);
}
else if((t->rchild) && !(t->lchild)) //只有右子树情况
{
if(t->rchild->data<t->data)
return false;
else
return IsSearchTree(t->rchild);
}
else //左右子树全有情况
{
if((t->lchild->data>t->data) || (t->rchild->data<t->data))
return false;
else
return ( IsSearchTree(t->lchild) && IsSearchTree(t->rchild) );
}
}
int main()
{
Bitree *tree;
tree=CreateBiTree();
if(IsSearchTree(tree))printf("Yes\n");
else printf("No\n");
return 0;
}
参考答案(时间最优[0]):
#include "stdio.h"
#include "iostream"
using namespace std;
#include "stdlib.h"
typedef struct node
{
int data;
struct node *lchild;
struct node *rchild;
} Bitree;
Bitree *B[100];
Bitree *CreateBiTree()
{
int num,i,n;
Bitree *t,*s;
t=NULL;
num=0;
scanf("%d",&n);
while(n!=-1)
{
s=(Bitree *)malloc(sizeof(Bitree));
s->data=n;
s->lchild=s->rchild=NULL;
num++;
if(!t)t=s;
B[num]=s;
scanf("%d",&n);
}
for(i=1;i<=num;i++)
{
if(B[i]->data!=0)
{
if(2*i<=num && B[2*i]->data!=0)
B[i]->lchild=B[2*i];
if(2*i+1<=num && B[2*i+1]->data!=0)
B[i]->rchild=B[2*i+1];
}
}
return t;
}bool IsSearchTree(Bitree *t) //递归遍历二叉树是否为二叉排序树
{
if(!t) //空二叉树情况
return true;
else if(!(t->lchild) && !(t->rchild)) //左右子树都无情况
return true;
else if((t->lchild) && !(t->rchild)) //只有左子树情况
{
if(t->lchild->data>t->data)
return false;
else
return IsSearchTree(t->lchild);
}
else if((t->rchild) && !(t->lchild)) //只有右子树情况
{
if(t->rchild->data<t->data)
return false;
else
return IsSearchTree(t->rchild);
}
else //左右子树全有情况
{
if((t->lchild->data>t->data) || (t->rchild->data<t->data))
return false;
else
return ( IsSearchTree(t->lchild) && IsSearchTree(t->rchild) );
}
}
int main()
{
Bitree *tree;
tree=CreateBiTree();
if(IsSearchTree(tree))printf("Yes\n");
else printf("No\n");
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。