您的位置:首页 > 其它

非递归建立二叉树 c

2011-01-20 10:52 274 查看
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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐