二叉木の幅C実装(非再帰)
1975 ワード
階層遍歴方式を採用し、1つのキューを使用して、各層のノードが順次入隊し、出隊し、幅を統計し、この層幅と前のk層の最大幅の大きさを比較する.
typedef int DataType;
struct Node
{
DataType data;
struct Node *leftChild;
struct Node *rightChild;
};
typedef struct Node BiTreeNode,*BiTree;
typedef struct QNode
{
BiTreeNode *addr;
struct QNode *link;
}qnode;
int Width_T(BiTree T)
{
/* , 0,
* ,
* : , , k
*/
int parentsize,currentsize,maxsize;
parentsize = currentsize = maxsize = 0;
if(T == NULL)
return 0;
qnode *head,*rear,*p,*q;//
head = rear = NULL;
p = (qnode*)malloc(sizeof(qnode));
p->addr = T;
p->link = NULL;
head = p;//
rear = p;
parentsize = maxsize= 1;
int i;
while(head!= NULL)
{
currentsize = 0;
i = 0;
while(i < parentsize && head != NULL)// ,
{
if(head != NULL)
{
if(head->addr->leftChild != NULL)
{
p = (qnode*)malloc(sizeof(qnode));
p->addr = head->addr->leftChild;
p->link = NULL;
rear->link = p;
rear = p;
currentsize++;
}
if(head->addr->rightChild != NULL)
{
p = (qnode*)malloc(sizeof(qnode));
p->addr = head->addr->rightChild;
p->link = NULL;
rear->link = p;
rear = p;
currentsize++;
}
}
q = head;
head = head->link;
free(q);
i++;
}
if(maxsize < currentsize)
maxsize = currentsize;
parentsize = currentsize;
}
return maxsize;
}