C/C++二分查找树的建立与按值查询

#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;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值