1. 问题描述:
先序非递归建立一颗以二叉链表为存储结构的二叉树。例如建立如下所示的一颗二叉树
A
/ \
B E
/ \ /
C D F
则输入应为: ABC_ _D_ _EF_ _ _ (其中_代表空格).
代码如下:
/*
* 名 称: 建立二叉树(非递归)
* 作 者: Brooke gao
* 时 间: 2013/8/21
*
*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define STACKSIZE 50
#define bitree_size(tree) ((tree)->size)
#define bitree_root(tree) ((tree)->root)
#define bitree_left(node) ((node)->left)
#define bitree_right(node) ((node)->right)
/*
* 定义二叉树结点以及二叉树的结构
*
*/
typedef struct BiTreeNode_
{
char data;
struct BiTreeNode_ *left;
struct BiTreeNode_ *right;
}BiTreeNode;
typedef struct BiTree_
{
int size;
BiTreeNode *root;
}BiTree;
/*
* 定义栈的结构
*
*/
typedef struct Stack_
{
BiTreeNode * base[STACKSIZE];
int top;
int stacksize;
}Stack;
void stack_init(Stack *stack)
{
stack->top = -1;
stack->stacksize = 0;
}
void push(Stack *stack, BiTreeNode *node)
{
if(stack->stacksize == STACKSIZE)
exit(-1);
stack->base[++stack->top] = node;
stack->stacksize++;
}
int stack_empty(Stack *stack)
{
if((-1 == stack->top) && (0 == stack->stacksize))
return 1;
else
return 0;
}
BiTreeNode* pop(Stack *stack)
{
if(stack->top < 0)
exit(-1);
else
{
stack->stacksize--;
return stack->base[stack->top--];
}
}
BiTreeNode* get_stack_top(Stack *stack)
{
if(stack->top < 0)
exit(-1);
return stack->base[stack->top];
}
void bitree_init(BiTree *tree)
{
tree->size = 0;
tree->root = NULL;
}
//给树tree的某个结点node插入数据域为data的左子树
int bitree_ins_left(BiTree *tree, BiTreeNode *node, const char data)
{
BiTreeNode *new_node, **position;
if(NULL == node)
{
if(bitree_size(tree) > 0)
return -1;
position = &tree->root;
}
else
{
if(bitree_left(node) != NULL)
return -1;
position = &node->left;
}
if( NULL == (new_node = (BiTreeNode *)malloc(sizeof(BiTreeNode))) )
return -1;
new_node->data = data;
new_node->left = NULL;
new_node->right = NULL;
*position = new_node;
tree->size++;
return 0;
}
//给树tree的某个结点node插入数据域为data的右子树
int bitree_ins_right(BiTree *tree, BiTreeNode *node, const char data)
{
BiTreeNode *new_node, **position;
if(NULL == node)
{
if(bitree_size(tree) > 0)
return -1;
position = &tree->root;
}
else
{
if(bitree_right(node) != NULL)
return -1;
position = &node->right;
}
if( NULL == (new_node = (BiTreeNode *)malloc(sizeof(BiTreeNode))) )
return -1;
new_node->data = data;
new_node->left = NULL;
new_node->right = NULL;
*position = new_node;
tree->size++;
return 0;
}
// 先序遍历函数
void pre_order(const BiTreeNode *node)
{
if(node)
{
printf("%c",node->data);
pre_order(node->left);
pre_order(node->right);
}
}
// 中序遍历函数
void in_order(const BiTreeNode *node)
{
if(node)
{
in_order(node->left);
printf("%c",node->data);
in_order(node->right);
}
}
// 后序遍历函数
void end_order(const BiTreeNode *node)
{
if(node)
{
end_order(node->left);
end_order(node->right);
printf("%c",node->data);
}
}
int main()
{
char data;
Stack stack;
BiTree tree;
BiTreeNode *node;
stack_init(&stack);
bitree_init(&tree);
printf("请以先序顺序输入结点值: \n");
data = getchar();
if( 0 == bitree_size(&tree) )
{
if( ' ' == data )
return -1;
bitree_ins_left(&tree,NULL,data);
push(&stack,tree.root);
}
while(!stack_empty(&stack))
{
data = getchar();
if( ' ' == data )
{
node = pop(&stack);
if(NULL == node->left)
{
data = getchar();
if( ' ' != data )
{
bitree_ins_right(&tree,node,data);
push(&stack,node->right);
}
}
}
else
{
node = get_stack_top(&stack);
if( NULL == node->left )
{
bitree_ins_left(&tree,node,data);
push(&stack,node->left);
}
else
{
node = pop(&stack);
bitree_ins_right(&tree,node,data);
push(&stack,node->right);
}
}
}
printf("-----先序遍历二叉树-----\n");
pre_order(tree.root);
putchar('\n');
printf("-----中序遍历二叉树-----\n");
in_order(tree.root);
putchar('\n');
printf("-----后序遍历二叉树-----\n");
end_order(tree.root);
putchar('\n');
return 0;
}
运行结果:
注:
最近复习到树一章,发现严蔚敏的《数据结构》一书关于二叉树的建立只有递归算法,而没有非递归算法。
但想着只要是递归能实现的非递归一定能实现,所以昨天开始试着自己看能不能写出来,但折腾了老半天
还是错误百出,最后干脆没头绪了。后来在网上找了一下,用非递归建立二叉树的很少,仅有的几个思路不
是很清晰且有些运行起来有些问题。今天经@zhao4zhong1老师的推荐,看了《算法精解--C语言描述》一
书有关二叉树的一章,总算是找到了非递归建立的方法,故有如上的实现方法。
分享到:
相关推荐
数据结构中二叉树建立以及递归、非递归遍历实现C代码
二叉树递归非递归遍历(递归前中后,非递归前中后,层次遍历)
非递归先序遍历二叉树: 非递归中序遍历二叉树: 非递归后序遍历二叉树: 非递归中序遍历二叉树(算法2): 层次遍历二叉树: 递归计算单分支结点: 递归计算双分支结点: 递归计算叶子数: 二叉数的深度:...
编写先序遍历二叉树的非递归算法程序,要求: (1)以二叉链表建立二叉树。 (2)输出遍历的结点序列。 (3)有实例验算。
中根顺序递归建立二叉树,递归及非递归遍历二叉树。C++面向过程实现
二叉树的非递归遍历运算 建立二叉树的三叉链式存储结构,在此基础上完成下列算法: 1) 从键盘上输入二叉树的各个结点,建立三叉链表 2) 输出该二叉树 3) 非递归的层次遍历算法 4) 非递归的先序遍历、中序遍历、...
小小学习,C语言数据结构,中序遍历二叉树非递归算法
利用c语言实现对二叉树的建立和非递归的中序遍历
关于数据结构实验的二叉树问题
后序遍历二叉树非递归算法的推导及形式化证明,难得的期刊论文资料,对研究二叉树的非递归性遍历有很大帮助
(1)输入字符序列,建立二叉链表 (2)中序遍历二叉树:递归 (3)中序遍历二叉树:非递归 (3)二叉树高度
包含二叉树的递归建立,非递归建立,先序非递归遍历,后序非递归遍历,C代码,是在TC环境下完全调试好的,并在文档中给予了详细的使用方法--LZL
数据结构作业 二叉树的建立,递归,非递归的前中后序遍历,注释详细。
数据结构 课程设计二叉树的非递归遍历 对任意给定的二叉树(顶点数自定)建立它的二叉链表存贮结构,并利用栈的五种基本运算(置空栈、进栈、出栈、取栈顶元素、判栈空)实现二叉树的先序、中序、后序三种遍历,输出...
代码主要包括:根据输入的前序、中序序列建立树,然后采用非递归(栈)的方式,前序、中序及后序遍历整个二叉树;注释还算完整,适合初学者~,程序在VC 6.0下编译通过~ 功能完整
先序非递归遍历二叉树: a b c 中序递归遍历二叉树: b a c 中序非递归遍历二叉树: b a c 后序递归遍历二叉树: b c a 后序非递归遍历二叉树: b c a 二叉树的深度是2 二叉树的结点个数是3 Press any key to ...
二叉树的两种建立方式,前中后序递归非递归遍历,层序遍历
输入先序遍历和中序遍历序列,建立二叉树的二叉链表 (非递归算法) 自己写的程序呐,调试运行过,绝对能用哒~~!
1.建立完全二叉树 2.先序非递归遍历二叉树函数 & 先序递归遍历二叉树验证 3.中序非递归遍历二叉树函数 & 中序递归遍历二叉树验证 4.后序非递归遍历二叉树函数 & 后序递归遍历二叉树验证
由先根次序和中跟次序建立二叉树,以及各种遍历的递归、非递归算法