二叉排序树

二叉排序树的定义:

二叉排序树(Binary Sort Tree)

空树or具有以下性质的二叉树

1>若左子树不空,则左子树上所有的结点小于根节点的值。

2>若右子树不空,则右子树上所有的结点大于根节点的值。

3>左右子树也分别是二叉排序树。

二叉排序树的特点:

中序遍历二叉树关键码有序

顺带一提关键码的定义:

关键码(Key)是数据结构(或记录)中某个数据项的值,用它可以标示一个数据元素(或记录)

关键码是在查找中的名词因此查找的定义便是:

查找(Searching)是指在含有n个数据元素的查找表中,找出关键码等于给定值kx的数据元素(或记录)

二叉排序树结点的定义如下:

typedef struct bistnode

{

    datatype data;

    struct bistnode *lchild,*rchild;

}BiSTNode,*BiSTree;

二叉排序树中插入一个结点:

BiSTree BST_InsertNode(BiSTree t,int kx)

{

    BiSTNode *f,*p,*s;

    p=t;

    while(p)

    {

        if(kx==p->data)

        {

            printf("kx已存在,不需插入");

            return(t);

        }

        else{

            f=p;

            if(kx<p->data) p=p->lchild;

            else p=p->rchild;

        }

    }

    s=(BiSTNode *)malloc(sizeof(BiSTNode));

    s->data=kx;

    s->lchild=NULL;

    s->rchild=NULL;

    if(!t) t=s;

    else if(kx<f->data) f->lchild=s;

    else f->rchild=s;

    return t;

}

构造一棵二叉排序树:

BiSTree BST_Creat()

{

    BiSTree t=NULL;

    int kx;

    scanf("%d",&kx);

    while(kx!=0)

    {

        t=BST_InsertNode(t,kx);

        scanf("%d",&kx);

    }

    return(t);

}

合在一起:

#include <stdio.h>

#include <stdlib.h>

 

int keydata[11]={63,90,70,55,67,42,98,83,10,45,58};

typedef int datatype;

typedef struct bistnode

{

    datatype data;

    struct bistnode *lchild,*rchild;

}BiSTNode,*BiSTree;

 

BiSTree BST_InsertNode(BiSTree t,int kx)

{

    BiSTNode *f,*p,*s;

    p=t;

    while(p)

    {

        if(kx==p->data)

        {

            printf("kx已存在,不需插入");

            return(t);

        }

        else{

            f=p;

            if(kx<p->data) p=p->lchild;

            else p=p->rchild;

        }

    }

    s=(BiSTNode *)malloc(sizeof(BiSTNode));

    s->data=kx;

    s->lchild=NULL;

    s->rchild=NULL;

    if(!t) t=s;

    else if(kx<f->data) f->lchild=s;

    else f->rchild=s;

    return t;

}

 

BiSTree BST_Creat()

{

    BiSTree t=NULL;

    int kx,i=0;

    while(i<11)

    {

        kx=keydata[i];

        t=BST_InsertNode(t,kx);

        i++;

    }

    return(t);

}

void PreOrderTraversal(BiSTree t)

{

    if(t)

    {

        printf("%d ",t->data);

        PreOrderTraversal(t->lchild);

        PreOrderTraversal(t->rchild);

    }

}

 

void MidOrderTraversal(BiSTree t)

{

    if(t)

    {

        MidOrderTraversal(t->lchild);

        printf("%d ",t->data);

        MidOrderTraversal(t->rchild);

    }

}

 

int main()

{

    BiSTree t;

    BiSTNode b;

    t=BST_Creat();

    MidOrderTraversal(t);

    return 0;

}

测试运行结果:

既然是查找那一定就有对关键码进行查找操作的函数:

原文地址:https://www.cnblogs.com/Andre/p/12069711.html