#include <string>
#include <stdlib.h>
#include <stdio.h>
//建立树的数据结构
typedef int Elemtype; //定义元素类型
typedef struct Tree{
Elemtype data; //每个节点存放的元素
struct Tree *LeftChild,*RightChild; //左右分支
} Tree,*TreePointer;
//生成节点函数
void EnterElement(TreePointer &T){
int Length;
printf("Please input the length of data:");
scanf("%d",&Length);
TreePointer Parents,Trons;
Elemtype Element;
int i=0;//计数器,用于控制外层循环次数
printf("Please input the element:\n");
while (i<Length){//用于将小循环产生的节点连接起来
scanf("%d",&Element);
if (T==NULL){
T=(TreePointer) calloc(1,sizeof (Tree));
T->data=Element;
T->LeftChild=T->RightChild=NULL;
i++;
continue;
}
Trons=T;
while (Trons!=NULL){//这一循环的作用时找出元素的插入位置
Parents=Trons;
if (Element>Parents->data){
Trons=Trons->RightChild;
}else if (Element<Parents->data){
Trons=Trons->LeftChild;
} else{
/*避免有相同的值存入树中。不是不能存如果有相同的值存入,
* 则代码难度会大大提高,而且将相同的值存入没有任何意义,
* 说人话就是我不会,懒得写*/
++i;
break;//避免当有相同元素时成为死循环
}
}
if (Trons==Parents){//用于跳过相同的元素:当有相同元素时,可以跳过后面程序,阻止形同的元素进入树中
continue;
}
TreePointer NewNode;
NewNode=(TreePointer) calloc(1,sizeof (Tree));//为新节点开辟空间
NewNode->data=Element;//将元素存入其中
/*if语句用于将节点连接到相应的位置*/
if (Element>Parents->data){
Parents->RightChild=NewNode;
} else if (Element<Parents->data) {
Parents->LeftChild = NewNode;
}
i++;
}
}
/*中序遍历函数:这里说明一点,由于存入树中的元素时按大小排列的,中序
* 遍历输出出来的值也是按大小排列的,因此要用中序遍历,而其他遍历方
* 式输出出来的值循序时乱的,所以没有必要用其他方式*/
void InOrderTraversal(TreePointer T){
if (T!=NULL){
if (T->LeftChild!=NULL){
InOrderTraversal(T->LeftChild);
}
printf("%-3d",T->data);
if (T->RightChild!=NULL){
InOrderTraversal(T->RightChild);
}
}
}
//按值查找查找算法
void Search(TreePointer T,Elemtype Target){
TreePointer Trons;
Trons=T;
if (Trons!=NULL){
if (Trons->data==Target){
printf("%-2d\n",Trons->data);
return;
}
if (Trons->data>Target){
Search(Trons->LeftChild,Target);
}else if (Trons->data<Target){
Search(Trons->RightChild,Target);
}
} else{
printf("Target element dose not exit!\n");
}
}
//查找函数:引用上一个Search函数,得到目标值。区别是,这个函数中,目标值可以通过scanf函数获取
void EventSearch(TreePointer T){
Elemtype Target;
printf("\nPlease input the target element:");
fflush(stdin);
scanf("%d",&Target);
Search(T,Target);
}
int main() {
TreePointer P;
EnterElement(P);
InOrderTraversal(P);
EventSearch(P);
return 0;
}
C/C++二分查找树的建立与按值查询
最新推荐文章于 2024-04-27 16:49:54 发布