摘要:一颗树只有一个儿子(最左儿子),该儿子连接着许多兄弟(右右邻兄弟)。
(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;
}