二叉排序树的建立

本文介绍了一种算法用于构建二叉排序树,并实现了查找操作。通过输入一系列整数,算法能够生成二叉排序树并在后续的查找过程中高效定位目标值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计一个算法,读入一整串整数构成一棵二叉排序树并进行查找。

测试数据:60 35 69 84 96 13 66 34 21 0

输出:13 21 34 35 60 66 69 84 96

输入查找数据:40

输出:13 21 34 35 60 66 69 84 96

算法思想:二叉排序树的构成,从空的二叉树开始,每次输入一个结点数据,就建立一个新结点插入到当前已生成的二叉排序树中,所以它的主要操作是二叉排序树的插入运算。在二叉排序树插入新的结点,只要保证插入后仍符合二叉排序树的定义即可。二叉排序树的查找过程:当二叉排序树非空时,首先将给定值与根结点比较,若相等,则查找成功,若小于根结点,则在左子树继续查找,若大于根结点的值,则在右子树上继续查找。

代码:

(1)中序遍历二叉树算法 inorder  (2)二叉排序树的插入算法 inserbst  (3)生成二叉排序树算法 creatord  (4)主函数

#include <iostream>
#include <stdio.h>
#include<malloc.h>
using namespace std;
typedef struct node
{
    int key;
    struct node *lchild, *rchild;
}bstnode;

void inorder(bstnode *t)
{
    if(t!=NULL)
    {
        inorder(t->lchild);
        printf("%4d",t->key);
        inorder(t->rchild);
    }//中序查找
}
bstnode * insertbst(bstnode *t,int k)
{
    bstnode *p;
    if(t==NULL)
    {
        p=(bstnode *)malloc(sizeof(bstnode));
        p->key=k;
        p->lchild=NULL;
        p->rchild=NULL;
        return (p);
    }
    else if(t->key==k) return(t);
    else if(t->key>k){t->lchild=insertbst(t->lchild,k);return (t);}
    else{t->rchild=insertbst(t->rchild,k);return(t);}
}
bstnode *creatord(){
bstnode *t;
int key;
t=NULL;
scanf("%d",&key);
while(key!=0)
    {
        t=insertbst(t,key);
        scanf("%d",&key);}
        return (t);

}
int main()
{
    //cout << "Hello world!" << endl;
    int key;
    bstnode * root;
    root=creatord();
    inorder(root);
    printf("\n input search key:");
    scanf("%d",&key);
    insertbst(root,key);
    inorder(root);
    printf("\n");

    return 0;
}

malloc函数为动态分配空间;
原型为: void * malloc(int size);

使用方法一般为:
假设你定义了一个名为Node的struct类型,你要定义一个名为a的Node类型的指针变量,使用以下语句:
Node * a=(Node *)malloc(sizeof(Node));
其中(Node *)为强制转换,把返回类型void *转换为Node *,sizeof(Node)为获取Node类型占据空间的大小,如在我机子上int类型占4字节,sizeof(int)就返回4;
使用malloc需要包含#include <malloc.h>

 

转载于:https://www.cnblogs.com/lqs-zsjky/p/4452243.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值