儿子/兄弟树

摘要:一颗树只有一个儿子(最左儿子),该儿子连接着许多兄弟(右右邻兄弟)。
(1)构造这样的一颗树:建立一个插入函数,若元素x比根大,就检测右兄弟,否则检测儿子,直到遇到空节点
(2)值得思考的是遍历并该树:利用一个队列,遇到一个节点,遍历他的兄弟,然后将所有遇到节点的儿子入队,直到遇到NULL节点,然后再出队一个节点,执行同样操作。

#include "stdafx.h"
#include "stdlib.h"
#include "malloc.h"
#include "math.h"
typedef struct Siblingrecord * Position;
typedef struct queuerecord * queue;
struct queuerecord
{
    int front;
    int rear;
    int size;
    int capcity;
    Position *Array;
};
queue Initqueue(queue Q,int Maxsize)
{
    Q = (queue)malloc(sizeof(queuerecord));
    Q->capcity = Maxsize;
    Q->Array = (Position *)malloc(sizeof(queue)*Maxsize);
    Q->front = 1;
    Q->rear = 0;
    Q->size = 0;
    return Q;
}
queue Enqueue(queue Q,Position x)
{
    if(Q->size == Q->capcity)
    {
        puts("error: enqueue full");
        return Q;
    }
    if (x != NULL)
    {
    Q->Array[++Q->rear] = x;
    Q->size ++;
    }
    return Q;
}
Position Dequeue(queue Q)
{
    if(Q->size == 0)
    {
        puts("error");
        return NULL;
    }
    Q->size--;
    return Q->Array[Q->front++];
}
struct Siblingrecord
{
    int Element;
    int height;
    Position child;
    Position sibling;
};
Position init()
{
    Position T;
    T = (Position)malloc(sizeof(Siblingrecord));
    T->Element = -1;
    T->sibling = NULL;
    T->child = NULL;
    T->height = 0;
    return T;
}
Position Insert(Position T,int x)
{
    if (T==NULL)
    {
        T = init();
        T->Element  = x;
        return T;
    }
    if (x > T->Element)
        T->sibling = Insert(T->sibling,x);
    else if (x<T->Element)
        T->child = Insert(T->child,x);
    else
        puts("error: there is a same element");
    return T;   
}
void PrintSibling(Position T)
{   
    queue Q = NULL;
    Q = Initqueue(Q,100);

    Position temp;
    Enqueue(Q,T);
    while(Q->size!=0)
    {
        T = Dequeue(Q);
        while(T!=NULL)
        {
        printf("%d: ",T->Element);
        Enqueue(Q,T->child);
        T = T->sibling;
        }
    }

}
int _tmain(int argc, _TCHAR* argv[])
{
    Position T = NULL;
 int data[]={12,5,32,56,2,7,23,676,97,54,234,79,1,3,15,22,13,16,888,21,25,24,26,100,101,102,103,104,105,106};
    for (int i = 0;i<30;i++)
        T = Insert(T,data[i]);
    PrintSibling(T);

    return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值