#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;
}
}