ZBLOG

#include #include typedef struct student{ char name[20]; int number; int score; } Student; typedef struct node{ Student data; struct node *left_child; struct node *right_child; } Node, *Tree; void po...

#include #include

typedef struct student{

char name[20];
int number;
int score;

} Student;

typedef struct node{

Student data;
struct node *left_child;
struct node *right_child;

} Node, *Tree;

void postorder_recursive(Tree tree); void preorder_nonrecursive(Tree tree); void levelorder(Tree tree);

int main(){

Student students[] = {
    {"Lei Zhenzi", 101401, 82},
    {"Jiang Ziya", 100032, 90},
    {"Ne Zha", 101674, 70},
    {"Shen Gongbao", 101982, 87},
    {"Jiu Weihu", 107431, 75},
    {"Tian Zun", 100001, 98},
    {"Tai Yi", 101009, 81},
    {"Yang Jian", 101321, 63},
    {"Huang Feihu", 101567, 72},
    {"Zhou Wang", 108160, 55},
    {"Li Jing", 102456, 84},
    {"Tu Xingsun", 102245, 65}
};

int n = sizeof(students) / sizeof(Student);
Tree tree[n+1]; // 注意这里要开辟 n+1个节点,因为根节点从1开始编号
for(int i = 1; i <= n; i++){
    Node *node = (Node*)malloc(sizeof(Node));
    node->data = students[i-1];
    node->left_child = NULL;
    node->right_child = NULL;
    tree[i] = node;
}
for(int i = 1; i <= n/2; i++){ // 构建完全二叉树
    if(i*2 <= n){
        tree[i]->left_child = tree[i*2];
    }
    if(i*2+1 <= n){
        tree[i]->right_child = tree[i*2+1];
    }
}

printf("| %-12s | %-8s | %-6s |\n", "Name", "Number", "Score");
printf("|-------------|----------|--------|\n");

printf("| Postorder recursive traversal: |\n");
postorder_recursive(tree[1]);
printf("\n");

printf("| Preorder nonrecursive traversal: |\n");
preorder_nonrecursive(tree[1]);
printf("\n");

printf("| Levelorder traversal:           |\n");
levelorder(tree[1]);
printf("\n");

return 0;

}

void postorder_recursive(Tree tree){

if(tree != NULL){
    postorder_recursive(tree->left_child);
    postorder_recursive(tree->right_child);
    printf("| %-12s | %-8d | %-6d |\n", tree->data.name, tree->data.number, tree->data.score);
}

}

void preorder_nonrecursive(Tree tree){

Tree stack[100];
int top = -1;

while(tree != NULL || top != -1){
    while(tree != NULL){
        printf("| %-12s | %-8d | %-6d |\n", tree->data.name, tree->data.number, tree->data.score);
        stack[++top] = tree;
        tree = tree->left_child;
    }

    if(top != -1){
        tree = stack[top--]->right_child;
    }
}

}

void levelorder(Tree root){

 Tree queue[100];
 int front=0,rear=0;

 queue[rear++]=root; 
 while(front!=rear){  
      Tree temp=queue[front++];
      printf("| %-12s | %-8d | %-6d |\n", temp->data.name, temp->data.number, temp->data.score);

      if(temp->left_child!=NULL) 
           queue[rear++]=temp->left_child;
      if(temp->right_child!=NULL) 
           queue[rear++]=temp->right_child;  
 } 

}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=4313

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?