zoukankan      html  css  js  c++  java
  • 二叉排序树

    二叉排序树的定义:

    二叉排序树(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;

    }

    测试运行结果:

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

  • 相关阅读:
    [Leetcode]@python 89. Gray Code
    [Leetcode]@python 88. Merge Sorted Array.py
    [Leetcode]@python 87. Scramble String.py
    [Leetcode]@python 86. Partition List.py
    [leetcode]@python 85. Maximal Rectangle
    0523BOM
    0522作业星座
    0522dom
    0520
    0519作业
  • 原文地址:https://www.cnblogs.com/Andre/p/12069711.html
Copyright © 2011-2022 走看看