树的层序遍历
顾名思义,就是一层一层的输出内容。要实现这个功能,需要用到我们之前学到的队列的相关操作。以二叉树为例,,根节点先输出,遍历所有节点,把当前节点的左右子节点也加入队列,若当前列队不为空,则输出队头节点,并获取对头节点的左右子节点加入队列,直到队列为空。
层序遍历代码
//层序遍历
bool LevelOrder(BiTree tree)
{
if(tree==NULL) return false;
LinkQueue *Q=(LinkQueue *)malloc(sizeof(LinkQueue));
InitLinkQueue(Q);
EnLinkQueue(Q,tree);
BiNode *cur_Node=tree;
while(!IsLinkQueueEmpty(Q))
{
cur_Node=DeLinkQueue(Q);
if(cur_Node->left!=NULL)EnLinkQueue(Q,cur_Node->left);
if(cur_Node->right!=NULL)EnLinkQueue(Q,cur_Node->right);
}
return true;
}
测试代码
int main(int argc, char* argv[])
{
BiTree tree;
InitTree(tree);
LevelOrder(tree);
return 0;
}
测试结果
入队1
出队1
入队2
入队3
出队2
入队4
入队5
出队3
入队6
出队4
入队7
出队5
出队6
出队7
其他用到的代码
#include "stdafx.h"
#include "stdlib.h"
#include "string.h"
#define MaxSize 50
#define bool int
#define true 1
#define false 0;
typedef struct BiNode
{
int data;
struct BiNode *left,*right;
}BiNode,*BiTree;
typedef struct LNode
{
struct LNode *next;
BiNode *data;
}LNode;
typedef struct
{
LNode *front,*rear;
}LinkQueue;
void InitLinkQueue(LinkQueue *Q)
{
Q->front=Q->rear=(LNode *)malloc(sizeof(LNode));
Q->front->next=NULL;
}
bool IsLinkQueueEmpty(LinkQueue *Q)
{
if(Q->front==Q->rear)
return true;
else
return false;
}
bool EnLinkQueue(LinkQueue *Q,BiNode *e)
{
LNode *newNode=(LNode *)malloc(sizeof(LNode));
newNode->data=e;
newNode->next=NULL;
printf("入队%d\n",e->data);
Q->rear->next=newNode;
Q->rear=newNode;
return true;
}
BiNode* DeLinkQueue(LinkQueue *Q)
{
//if(IsLinkQueueEmpty(Q))return null;
LNode *newNode=Q->front->next;
Q->front->next=newNode->next;
printf("出队%d\n",newNode->data->data);
BiNode *e=newNode->data;
if(newNode==Q->rear)
Q->rear=Q->front;
free(newNode);
return e;
}
bool visit(BiTree tree)
{
printf("%d->",tree->data);
return true;
}
void InitTree(BiTree &root)
{
root=(BiTree)malloc(sizeof(BiNode));
root->left=(BiNode *)malloc(sizeof(BiNode));
root->right=(BiNode *)malloc(sizeof(BiNode));
root->data=1;
root->left->data=2;
root->right->data=3;
root->left->left=(BiNode *)malloc(sizeof(BiNode));
root->left->right=(BiNode *)malloc(sizeof(BiNode));
root->left->left->data=4;
root->left->right->data=5;
root->left->right->left=NULL;
root->left->right->right=NULL;
root->right->left=(BiNode *)malloc(sizeof(BiNode));
root->right->right=NULL;
root->right->left->data=6;
root->right->left->left=NULL;
root->right->left->right=NULL;
root->left->left->left=NULL;
root->left->left->right=(BiNode *)malloc(sizeof(BiNode));
root->left->left->right->data=7;
root->left->left->right->left=NULL;
root->left->left->right->right=NULL;
}