二叉排序树的建立与中序遍历

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39360985/article/details/78857844

编译器:Xcode
编程语言:C

这里写图片描述

data1.txt文本数据为上图,在我的电脑里它的存储位置是:/Users/wsw/Desktop/数据结构/data1.txt

#include<stdio.h>
#include<stdlib.h>
#define N 100

typedef struct node            //二叉排序树结点定义
{
    int key;                      //结点值
    struct node *lchild,*rchild;  //左、右孩子指针
}bsnode;

typedef bsnode *bstree;

//从文件中读入数据存入数组a
int readData(int a[], int n,char *f )  //函数返回成功读入放入数据个数
{
    FILE *fp;
    int i;
    fp=fopen(f,"r");
    if (fp==NULL)   return 0;
    else
    {
        for (i=0; i<n && !feof(fp); i++)
            fscanf(fp,"%d",&a[i]);
        fclose(fp);
        return i;
    }
}

void output(int a[],int n) //输出数组的内容
{
    int i;
    printf("数组的内容是:");
    for (i=0; i<n; i++)
    {
        if (i%10==0)
            printf("\n");
        printf("%7d",a[i]);
    }
    printf("\n");
}

bstree  creatBstree(int a[],int n) //非递归建立二叉排序树
{
    //根据输入的结点序列,建立一棵二叉排序树,并返回根结点的地址
    bstree  bt;
    bt=(bstree)malloc(sizeof(bsnode));
    bt->key=a[0];
    bt->lchild=bt->rchild=NULL;
    for(int i=1;i<n;i++)
    {
        bstree s,p=bt,q;
        s=(bstree)malloc(sizeof(bsnode));
        s->key=a[i];
        s->lchild=s->rchild=NULL;
        while (p)
        {
            if (p->key>a[i])
            {
                q=p;
                p=p->lchild;
            }
            else
            {
                q=p;
                p=p->rchild;
            }
        }
        if (q->key>a[i])
            q->lchild=s;
        else
            q->rchild=s;
    }
    return bt;
}
/*
p是待判断的节点,一个要插入的节点需要和p节点的值进行比较,
比p的值大,就往p的右孩子找,p=p->rchild,
比p的值小,就往p的左孩子找,p=p->lchild;
q记录的是当前需要插入节点的父亲节点,
当前需要插入节点的值比它的值小,成为它的左孩子,q->lchild=s,
当前需要插入节点的值比它的值大,成为它的右孩子,q->rchild=s
*/



void inorder(bstree t) //中序遍历二叉排序树
{
    if (t)
    {
        inorder(t->lchild);
        printf("%8d",t->key);
        inorder(t->rchild);
    }
}
//中序遍历的原因是:对于二叉排序树,中序遍历的结果就是从小到大排列的,所以可以用来判断二叉排序树是否成功创建.

int  main()
{
    int n,a[N];
    bstree t;
    n=readData(a,N,"/Users/wsw/Desktop/数据结构/data1.txt");
    output(a,n);
    t=creatBstree(a,n); //创建二叉排序树
    printf("中序遍历:\n");
    inorder(t);
    return 0;
}


运行结果:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_39360985/article/details/78857844
今日推荐