版权声明:while (!success) try(); https://blog.csdn.net/qq_35850147/article/details/88960400
6-4 Level-order Traversal (25 分)
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
题解:
#include <stdbool.h>
void Level_order(Tree T, void (*visit)(Tree ThisNode))
{
if (T == NULL)
return;
Tree List[1000] = {NULL};
int cnt = 0;
bool flag = true;
List[cnt++] = T;
while (flag)
{
Tree t = NULL;
flag = false;
for (int i = 0; i < cnt; i++)
if (List[i])
{
t = List[i];
List[i] = NULL;
flag = true;
break;
}
if (t)
{
(*visit)(t);
if (t->Left)
List[cnt++] = t->Left;
if (t->Right)
List[cnt++] = t->Right;
}
}
}