易网时代-编程资源站
Welcome
微信登录
编程资源
图片资源库
蚂蚁家优选
PDF转换器
软件资源
软件开发
、
小程序制作
、
系统集成与运维
、
空间租用
、
硬件开发
、
视频监控
、
技术咨询与支持
——联系电话:0311-88999002/88999003
首页
/
操作系统
/
Linux
/
二叉树顺序表示的实现(C语言)
二叉树顺序表示的实现(C语言)
#include <stdio.h>
#include <string.h>
#include <math.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAX_TREE_SIZE 100
typedef
char
seq_bitree[MAX_TREE_SIZE]; //可以把seq_bitree当做一个数据类型用了
char
nil = " "; //字符型节点设" "为空节点
int
(*visit_fun)(
char
);
struct
position
{
int
level;
int
order;
};
/*
初始化二叉树,结点值赋为nil
*/
void
init_seq_bitree(seq_bitree tree)
{
int
i = 0;
for
(i = 0; i < MAX_TREE_SIZE; i++)
{
tree[i] = nil;
}
return
;
}
/*
根据输入的层序str_tree,创建二叉树
*/
void
create_seq_bitree(seq_bitree tree,
char
*str_tree)
{
int
i = 0;
int
len = 0;
len = strlen(str_tree);
for
(i = 0; i < len; i++)
{
if
(str_tree[i] == 0)
{
tree[i] = nil;
}
else
{
tree[i] = str_tree[i];
}
if
((i != 0) && (tree[(i + 1) / 2 - 1] == nil) && (tree[i] != nil))
{
printf("出现了无父节点的非根节点! ");
exit(ERROR);
}
}
for
(i = len; i < MAX_TREE_SIZE; i++) //将剩余的部分置为空节点
{
tree[i] = nil;
}
return
;
}
/*
功能: 判断二叉树是否为空
返回: TRUE 为空;FLASE 非空
*/
int
is_bitree_empty(seq_bitree tree)
{
if
(tree[0] == nil)
{
return
TRUE;
}
else
{
return
ERROR;
}
}
/*
获取二叉树的深度
*/
int
get_bitree_depth(seq_bitree tree)
{
int
i = 0;
int
depth = 0;
for
(i = (MAX_TREE_SIZE - 1); i >= 0; i--)
{
if
(tree[i] != nil)
{
break
;
}
}
do
{
depth++;
}
while
(i >= (
int
)pow(2, depth));
return
depth;
}
/*供preorder_traverse调用*/
void
pre_traverse(seq_bitree tree,
int
index)
{
visit_fun(tree[index]);
if
(tree[2 * index + 1] != nil)
{
pre_traverse(tree, (2 * index + 1));
}
if
(tree[2 * index + 2] != nil)
{
pre_traverse(tree, (2 * index + 2));
}
}
/*
先序遍历二叉树
*/
int
preorder_traverse(seq_bitree tree,
int
(*visit)(
char
))
{
visit_fun = visit;
if
(is_bitree_empty(tree))
{
printf("the tree is empty. ");
}
pre_traverse(tree, 0);
return
OK;
}
/*供inorder_traverse调用*/
void
in_traverse(seq_bitree tree,
int
index)
{
if
(tree[2 * index + 1] != nil)
{
in_traverse(tree, (2 * index + 1));
}
visit_fun(tree[index]);
if
(tree[2 * index + 2] != nil)
{
in_traverse(tree, (2 * index + 2));
}
}
/*
中序遍历二叉树
*/
int
inorder_traverse(seq_bitree tree,
int
(*visit)(
char
))
{
visit_fun = visit;
if
(is_bitree_empty(tree))
{
printf("the tree is empty. ");
}
in_traverse(tree, 0);
return
OK;
}
/*供postorder_traverse调用*/
void
post_traverse(seq_bitree tree,
int
index)
{
if
(tree[2 * index + 1] != nil)
{
post_traverse(tree, (2 * index + 1));
}
if
(tree[2 * index + 2] != nil)
{
post_traverse(tree, (2 * index + 2));
}
visit_fun(tree[index]);
}
/*
后序遍历二叉树
*/
int
postorder_traverse(seq_bitree tree,
int
(*visit)(
char
))
{
visit_fun = visit;
if
(is_bitree_empty(tree))
{
printf("the tree is empty. ");
}
post_traverse(tree, 0);
return
OK;
}
/*
按层遍历二叉树
*/
int
level_order_traverse(seq_bitree tree,
int
(*visit)(
char
))
{
int
i = MAX_TREE_SIZE - 1;
int
j = 0;
visit_fun = visit;
if
(is_bitree_empty(tree))
{
printf("the tree is empty. ");
return
OK;
}
while
(tree[i] != nil)
{
i--;
}
for
(j = 0; j <+ i; j++)
{
if
(tree[j] == nil) //不存在的结点不打印
{
continue
;
}
visit_fun(tree[j]);
}
printf(" ");
return
OK;
}
int
visit(
char
e)
{
printf("%c ", e);
return
OK;
}
int
main(
int
argc,
char
*argv[])
{
seq_bitree tree;
char
str_tree[MAX_TREE_SIZE] = "abcde fg";
//测试数据,假设二叉树层序遍历如上(" "表示该处无节点)
init_seq_bitree(tree);
create_seq_bitree(tree, str_tree);
if
(is_bitree_empty(tree))
{
printf("the bitree is empty. ");
return
0;
}
printf("the depth of the bitree is %d ", get_bitree_depth(tree));
printf("先序遍历二叉树: ");
preorder_traverse(tree, visit);
printf(" 中序遍历二叉树: ");
inorder_traverse(tree, visit);
printf(" 后序遍历二叉树: ");
postorder_traverse(tree, visit);
printf(" 按层遍历二叉树: ");
level_order_traverse(tree, visit);
return
0;
}
收藏该网址
版权所有©石家庄振强科技有限公司2024
冀ICP备08103738号-5
网站地图