【算法总结】二叉排序树

【算法总结】二叉排序树

二叉排序树是一棵特殊的二叉树,它是一棵二叉树但同时满足如下条件:对于树上任意一个结点,其上的数值必大于等于其左子树上任意结点数值,必小于等于其右子树上任意结点的数值

二叉排序树的存储方式与二叉树保持一致,我们更多的关注它独有的操作。

我们从二叉树的插入开始了解其建树方式,对二叉排序树插入数字 x:

1.若当前树为空,则 x 为其根结点。

2.若当前结点大于 x,则 x 插入其左子树;若当前结点小于 x,则 x 插入其右子树;若当前结点等于 x,则根据具体情况选择插入左右子树或者直接忽略。

以插入 4、2、6、1、3 为例,其二叉排序树变化情况如下图。

由于各个数字插入的顺序不同,所得到的二叉排序树的形态也很可能不同, 所以不同的插入顺序对二叉排序树的形态有重要的影响。但是,所有的二叉排序树都有一个共同的特点:若对二叉排序树进行中序遍历,那么其遍历结果必然是一个递增序列,这也是二叉排序树名字的来由,通过建立二叉排序树就能对原无序序列进行排序,并实现动态维护。 

例 3.5 二叉排序树 

AC代码

#include<cstdio>
#include<cstring>

struct Node//树结点结构体
{
    Node *lchild;//左儿子指针
    Node *rchild;//右儿子指针
    int c;//保存数字
}Tree[110];//静态内存分配数组

int loc;//静态数组中被使用元素的个数,方便定位结点位置

Node *creat() //申请一个结点空间,返回指向其的指针
{
    Tree[loc].lchild = Tree[loc].rchild = NULL;//初始化左右儿子为空
    return &Tree[loc++];//返回指针,且loc累加
}

char str1[30], str2[30];//保存前序和中序遍历结果的字符串

void postOrder(Node *T)//后序遍历
{
    if (T->lchild != NULL)postOrder(T->lchild);//左子树不为空,递归遍历左子树
    if (T->rchild != NULL)postOrder(T->rchild);//右子树不为空,递归遍历右子树
    printf("%d ", T->c);//遍历该结点,输出其字符信息
}

void inOrder(Node *T)//中序遍历
{
    if (T->lchild != NULL)inOrder(T->lchild);//右子树不为空,递归遍历右子树
    printf("%d ", T->c);//遍历该结点,输出其字符信息
    if (T->rchild != NULL)inOrder(T->rchild);//左子树不为空,递归遍历左子树
}

void preOrder(Node *T)//前序遍历
{
    printf("%d ", T->c);//遍历该结点,输出其字符信息
    if (T->lchild != NULL)preOrder(T->lchild);//左子树不为空,递归遍历左子树
    if (T->rchild != NULL)preOrder(T->rchild);//右子树不为空,递归遍历右子树
}

Node* Insert(Node *T, int x)//插入数字
{
    if (T == NULL)//若当前树为空
    {
        T = creat();//建立结点
        T->c = x;//数字直接插入其根结点
        return T;//返回根结点指针
    }
    else if (x < T->c) T->lchild = Insert(T->lchild, x);//若x数值小于根结点,插入到左子树
    else if (x > T->c) T->rchild = Insert(T->rchild, x);//若x数值大于根结点,插入到右子树
    return T;//返回根结点指针,x数值和根结点相同时,应题目要求直接忽略
}

int main()
{
    int n;
    while (scanf("%d", &n) != EOF)
    {
        loc = 0;
        Node *T = NULL;//二叉排序树树根节点为空
        for (int i = 0; i < n; i++)//依次读入n个数字
        {
            int x;
            scanf("%d", &x);
            T = Insert(T, x);//插入到排序树中
        }
        preOrder(T);//前序遍历
        printf("\n");
        inOrder(T);//中序遍历
        printf("\n");
        postOrder(T);//后序遍历
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/yun-an/p/11070612.html