二叉排序树

 

27. 二叉排序树

成绩: 10 / 折扣: 0.8

撰写一个程序,能够构建字符串型的二叉排序树并在二叉排序树中查找节点。

所谓二叉排序树,简而言之,是一个每个节点可指向 0、1 或 2 个节点的递归的数据结构。最上层的一个节点称为树根。二叉排序树服从凡是比当前节点小的值都在其左下方,比当前节点大的值都在其右下方的规律。该规律不仅适用于树的局部,也适用于整棵二叉排序树。

例如,在给定 Kiwi, Banana, Apple, Melon, Berry 的输入字符串的顺序下,以此构建二叉排序树的过程为:

二叉排序树_第1张图片

建树后,请根据给定的字符串,查找树中是否有该节点。若有,返回其节点在所在的层次数(根节点Kiwi的层次定义为0);若无,返回“Not Found”。

输入

每行一个字符串,作为要插入二叉排序树的值。若单独一个*字符占一行,则表明用于建树的字符串输入数据结束。随后以[Search]开始的若干行,代表要在树中查找某个字符串值,用于查找的字符串紧跟其后。

输出

输出每个要查找的值所在的层次数。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct tree
{	char name[300];
	struct tree *left,*right;
} *head,*p=NULL,*q;
char s[300];

typedef struct tree Tree;

void search();
void seek();

void main()
{	
	head=(Tree *)malloc(sizeof(Tree));
	scanf("%s",head->name);
	q=head;
	q->left=NULL;
	q->right=NULL;
	while(scanf("%s",s)&&strcmp(s,"*"))
	{	p=(Tree *)malloc(sizeof(Tree));
		if(p==NULL)
			exit(0);
		p->left=NULL;
		p->right=NULL;
		strcpy(p->name,s);
		search();
	}
	while(scanf("%s",s)!=EOF)
		seek();
	return ;
}

void search()
{	Tree *k;
	
	k=head;
	while(1)
	{	if(strcmp(s,k->name)<0)
		{	if(k->left==NULL)
			{	k->left=p;
				break;
			}
			else
				k=k->left;
		}
		if(strcmp(s,k->name)>0)
			{	if(k->right==NULL)
				{	k->right=p;
					break;
				}
				else
					k=k->right;
			}
	}
}

void seek()
{	Tree *k;
	int count=-1;

	k=head;
	while(1)
	{	count++;
		if(!strcmp(&s[8],k->name))
		{	printf("%s-%d\n",&s[8],count);
			return ;
		}
		else
		{	if(strcmp(&s[8],k->name)<0)
			{	if(k->left==NULL)
					break;
				else
					k=k->left;
			}
			else
			{	if(k->right==NULL)
					break;
				else
					k=k->right;
			}
		}
	}
	printf("%s-Not Found\n",&s[8]);
}

你可能感兴趣的:(二叉排序树)