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

测试数据: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>