1. 非递归建立二叉树 c 建立过程如下图所示: 插入左子树时压栈,插入右子树时出栈 #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 200 struct node { char data; struct node *left,*right; }; //新建一个结点,并为新结点赋值 struct node * malloc_node(char data) { struct node * temp = NULL; remalloc: temp = (struct node *)malloc(sizeof(struct node)); if (temp == NULL) { goto remalloc; } temp->data = data; //如果不初始化为NULL,则结束条件if(head==NULL)不成立 temp->left = NULL; temp->right = NULL; return temp; } struct node * create_bintree(char* tree_node) { struct node * root = NULL; struct node * root_t = NULL; struct node * temp = NULL; struct node * stack[MAX_SIZE]; int top = -1; //若首字符为'#',则建空树 if (*tree_node == '#') { printf("create an empty bintree!/n"); return NULL; } //非空树 root = malloc_node(*tree_node); root_t = root; while(*tree_node != '/0') { //若上一个插入字符为#,不为叶子结点,继续插入左子树 if (*tree_node != '#') { tree_node ++; stack[++top] = root_t;//入栈 //插入新结点 temp = malloc_node(*tree_node); root_t->left = temp; root_t = temp; } //若上一个插入字符为#,上一个插入结点为叶子结点,出栈 if (*tree_node == '#' && top!=-1 ) { tree_node ++; root_t = stack[top--];//出栈 //插入新结点 temp = malloc_node(*tree_node); root_t->right = temp; root_t = temp; } if (*tree_node=='#' && top==-1) { *tree_node++; } } return root; } //前序遍历 void preorder_traversal(struct node *root) { if(root != NULL) { if(root->data != '#') printf("%c",root->data); preorder_traversal(root->left); preorder_traversal(root->right); } } int main(int argc, char* argv[]) { //每个叶子后必须加##,否则会多插入一个空字符结点 char tree_node[20]={'1','2','#','#','3','#','#','/0'}; struct node * root = NULL; root = create_bintree(tree_node); preorder_traversal(root); printf("/n"); }