二叉排序树的判定
描述
假设二叉树每个结点的元素均为一个单字符,根据给定的字符序列按照先序遍历的顺序递归创建该树的二叉链表,然后判断该二叉树是否为二叉排序树。
输入
多组数据,每组数据有一行。每行为一个二叉树对应的前序序列(其中‘#’表示空树)。当序列为“#”时,输入结束。
输出
每组数据输出1行,若此二叉树为二叉排序树则输出“YES”,否则输出“NO”。
样例输入1
ba##c## ca##b## #
样例输出1
YES NO
解答:判断二叉排序树中序遍历结果是否为递增序列,也可以递归判断当前结点的数据是否大于它的left数据小于它的right数据。
#include<stdio.h>
#include<stdlib.h>
#define maxn 200
typedef struct node
{
char data;
struct node *left,*right;
} Node,*TNode;
int k,t,flag;
char s[maxn];
void Create(TNode &T)
{
k++;
if(s[k]=='#')
T=NULL;
else
{
T=(Node *)malloc(sizeof(Node));
T->data=s[k];
Create(T->left);
Create(T->right);
}
}
void InOrder(TNode T)
{
if(T)
{
InOrder(T->left);
if(t > T->data)
{
flag=1;
return ;
}
else
t=T->data;
InOrder(T->right);
}
}
int main()
{
TNode T;
while(1)
{
scanf("%s",s);
if(s[0]=='#'&&s[1]=='\0')
break;
k=-1;
Create(T);
t=0;
flag=0;
InOrder(T);
if(flag)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}