一对多,树状关系。
有且就有一个根节点,其他的节点为互不相交的有限集合,树的定义是递归的定义。
一个节点的子树的个数为该节点的度数,一棵树的度数是指该树中节点的最大度数。
typedef char datatype_bt;
typedef struct btreenode{
datatype_bt data;
struct btreenode *lchild,*rchild;
}btree_node,*btree_pnode;
#if 0 //递归实现方式
btree_pnode create_btree(void)
{
datatype_bt ch;
btree_pnode new;
scanf("%c",&ch);
if(‘#‘ == ch)
{
return NULL;
}
else{
// 创建根节点
new = (btree_pnode)malloc(sizeof(btree_node));
if(NULL == new)
{
perror("malloc");
exit(1);
}
new->data = ch;
// 用相同的方法创建左子树
new->lchild = create_btree();
// 用相同的方法创建右子树
new->rchild = create_btree();
}
}
else
void create_btree(btree_pnode *T)
{
datatype_bt ch;
scanf("%c",&ch);
if(‘#‘ == ch){
*T = NULL;
}
else{
//创建根节点
*T = (btree_pnode)malloc(sizeof(btree_node));
if(NULL = *T){
perror("malloc");
exit(1);
}
(*T)->data = ch;
create_btree(&(*T)->lchild);
create_btree(&(*T)->rchild);
}
}
由于二叉树的递归性质,遍历算法也是递归的,三种基本遍历算法:
按正常情况,每个节点都会经过3次,但我们只需要遍历访问一次,这便造成不同的结果:
// 先序遍历
void pre_order(btree_pnode t)
{
if(t != NULL){
// 访问根节点
printf("%c",t->data);
// 先序遍历左子树
pre_order(t->lchild);
// 先序遍历右子树
pre_order(t->rchild);
}
}
链式队列实现层次遍历
void level_order(btree_pnode t)
{
linkqueue_pnode q;
init_linkqueue(&q);
while(t != NULL){
printf("%c",t->data);
if(t->lchild != NULL)
in_linkqueue(t->lchild,q);
if(t->rchild != NULL)
in_linkqueue(t->rchild,q);
if(!is_empty_linkqueue(q))
out_linkqueue(q,&t);
else
break;
}
}
原文:https://www.cnblogs.com/RSheng16/p/12620685.html