BST学习记录

烂漫一生 提交于 2020-02-05 01:08:57

  最近在学BST,打算发此贴先记录一下学习过程以及例子。

BST特点:

1.右子树大于根节点

2.左子树小于根节点

3.左右节点分别为BST

  以下为插入算法的伪代码:

f(b,x){
    if(b==NULL){
        Init b  //初始化b,并且使他左右子树都为null
        b->data=x  //将该数据赋值给该节点
    }
    else{
        if(x>b->data) f(b->lchild,x) //如果此数据大于该节点,则让他去左子树
        else f(b->rchild,x)   //否则去右子树
    }
}

  若要从小到大访问,采用中序遍历 以下为伪代码

f(b){
    if(b){
        f(b->lchild)
        cout << b->data
        f(b->rchild)
    }
}

 

  


 

以下为一个例子:输入学生信息,根据成绩由小到大排名

#include <iostream>
#include <fstream>
using namespace std;
ofstream out("out.txt");
ifstream in("in.txt");
struct student
{
    string name;
    int id;
    float score;
};
typedef struct BST
{
    student data;
    BST *lchild, *rchild;
} BST;
void Insertbst(BST *&b, student datas)
{
    if (b == NULL)
    {
        b = new BST;
        b->data = datas;
        b->lchild = b->rchild = NULL;
    }
    else
    {
        if (datas.score > b->data.score)
            Insertbst(b->rchild, datas);
        else
            Insertbst(b->lchild, datas);
    }
}
void output(BST *b)
{
    if (b)
    {
        output(b->lchild);
        out << b->data.name << "," << b->data.id << "," << b->data.score << endl;
        output(b->rchild);
    }
}
int main()
{
    int n;
    in >> n;
    student datas[n];
    for (int i = 0; i < n; i++)
        in >> datas[i].name >> datas[i].id >> datas[i].score;

    BST *b = NULL;
    for (int i = 0; i < n; i++)
    {
        Insertbst(b, datas[i]);
    }
    output(b);
    system("pause");
}
View Code

输入:

6
zhao 10001 87.5
qian 10002 90.5
sun 10003 75
li 10004 94
zhou 10005 99
wu 10006 92

输出:

sun,10003,75
zhao,10001,87.5
qian,10002,90.5
wu,10006,92
li,10004,94
zhou,10005,99

 

2020-02-05


 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!