4-6-Level-order Traversal

来源:互联网 发布:js一个函数执行完成 编辑:程序博客网 时间:2024/06/05 19:25
4-6 Level-order Traversal

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
visit 是一个函数指针,它指向 Print 函数的 ILT (Incremental Link Table) 地址,@ILT+0(_order):00401005   jmp         order (00401080)@ILT+5(_Print):0040100A   jmp         Print (00401030)@ILT+10(_main):0040100F   jmp         main (004010d0)visit 会赋值为 0040100A ,之后程序会jmp 到Print 函数入口执行程序,在order 函数调用完成后,visit的值也将消失。
void Level_order ( Tree T, void (*visit)(Tree ThisNode) ){Tree Q[MaxTree];int front, rear, i;front = 0;rear = 0;i = 0;Q[front] = T;if(!T)return;while(i <= rear){        /* 当T只有一个节点时, rear==front==0, i==1, i>rear ; 当root只有一子时,第一次后, i==rear==1 */if(Q[i]->Left)Q[++rear] = Q[i]->Left;if(Q[i]->Right)Q[++rear] = Q[i]->Right;i++;}for(i=front; i<=rear; i++)(*visit)(Q[i]);}
1 0
原创粉丝点击