6-6 Level-order Traversal (25 point(s))
Write a routine to list out the nodes of a binary tree in "level-order". List the root, then nodes at depth 1, followed by nodes at depth 2, and so on. You must do this in linear time.
Format of functions:
void Level_order ( Tree T, void (*visit)(Tree ThisNode) );
where void (*visit)(Tree ThisNode)
is a function that handles ThisNode
being visited by Level_order
, and Tree
is defined as the following:
typedef struct TreeNode *Tree;
struct TreeNode {
ElementType Element;
Tree Left;
Tree Right;
};
Sample program of judge:
#include <stdio.h>
#include <stdlib.h>
#define MaxTree 10 /* maximum number of nodes in a tree */
typedef int ElementType;
typedef struct TreeNode *Tree;
struct TreeNode {
ElementType Element;
Tree Left;
Tree Right;
};
Tree BuildTree(); /* details omitted */
void PrintNode( Tree NodePtr )
{
printf(" %d", NodePtr->Element);
}
void Level_order ( Tree T, void (*visit)(Tree ThisNode) );
int main()
{
Tree T = BuildTree();
printf("Level-order:");
Level_order(T, PrintNode);
return 0;
}
/* Your function will be put here */
Sample Output (for the tree shown in the figure):
Level-order: 3 5 6 1 8 10 9
二叉树的层序遍历需要借助队列完成。算法的过程如下
首先3入队列,然后出对输出3,然后将3的左右节点5,6入队列
5出队,输出5,1,8入队,直到所有队列为空。
这里队列的实现可以使用数组实现,用一个数组头Front和数组尾Rear实现,出队操作Front++,入队操作Rear++
#include <stdio.h>
#include <stdlib.h>
#define MaxTree 10 /* maximum number of nodes in a tree */
typedef int ElementType;
typedef struct TreeNode *Tree;
struct TreeNode {
ElementType Element;
Tree Left;
Tree Right;
};
Tree BuildTree(); /* details omitted */
void PrintNode(Tree NodePtr)
{
printf(" %d", NodePtr->Element);
}
void Level_order(Tree T, void(*visit)(Tree ThisNode));
int main()
{
Tree T = BuildTree();
printf("Level-order:");
Level_order(T, PrintNode);
return 0;
}
void Level_order(Tree T, void(*visit)(Tree ThisNode))
{
if (!T)
return; // 如果数为空返回
Tree queue[100];
Tree temp;
int front = 0;
int Rear = 0;
queue[Rear++] = T; // 节点入队
while (front != Rear) // 当节点不为空
{
temp = queue[front++]; // 出队伍
visit(temp);
if (temp->Left)
queue[Rear++] = temp->Left;
if (temp->Right)
queue[Rear++] = temp->Right;
}
}