二叉树由根节点和子树构成,子树又分为左子树和右子树,是一种递归定义。
二叉树在利用顺序存储时,一般都是先将其补成完全二叉树之后,在进行存储,如果一个树没有左孩子,只有右孩子,深度还较大时,将浪费大量空间。所以一般二叉树利用链式存储的方式实现。
二叉树的节点结构如下:
typedef char datatype_bt;
typedef struct btreenode{
datatype_bt data; //数据类型
struct btreenode *lchild,*rchild; //左孩子和右孩子
}btree_node,*btree_pnode;
在创建二叉树时通过让用户输入的方式来申请空间,具体代码如下:
btree_pnode create_btree(void) //创建二叉树
{
datatype_bt ch;
btree_pnode new;
scanf("%c",&ch);
if('#'== ch)
return NULL;
else
{
if((new = (btree_pnode)malloc(sizeof(btree_node)))== NULL)
{
printf("malloc failed!\n");
return NULL;
}
new->data = ch;
new->lchild = create_btree(); //用相同方法创建左子树
new->rchild = create_btree(); //用相同方法创建右子树
}
}
在进行遍历时常见的先序、中序、后序三种方式如下:
void pre_order(btree_pnode t) //先序遍历递归算法实现
{
if(t!=NULL)
{
printf("%c",t->data);//访问根节点
pre_order(t->lchild);//先序遍历左子树
pre_order(t->rchild);//先序遍历右子树
}
}
void mid_order(btree_pnode t) //中序遍历递归算法实现
{
if(t!=NULL)
{
mid_order(t->lchild);
printf("%c",t->data);
mid_order(t->rchild);
}
}
void last_order(btree_pnode t) //后序遍历递归算法实现
{
if(t!=NULL)
{
last_order(t->lchild);//后序遍历左子树
last_order(t->rchild);//后序遍历右子树
printf("%c",t->data);
}
}
反思:
要深刻理解二叉树的递归定义,然后才能在实现各种方法时巧妙的利用递归特性。