您的位置:首页 > 其它

二叉树的二叉链表表示与实现

2017-08-08 10:21 330 查看
二叉树的特点是每个结点至多只有两棵子树,且二叉树有左右字子树之分,次序不能任意颠倒。二叉树的存储结构可以用顺序存储和链式存储来存储。二叉树一般使用链式存储结构,由二叉树的定义可知,二叉树的结点由一个数据元素和分别指向其左右孩子的指针构成,即二叉树的链表结点中包含3个域,这种结点结构的二叉树存储结构称之为二叉链表。

typedef struct tnode {
elemtype        data;
struct tnode        *lchild;
struct tnode        *rchild;
}*bitree, bitnode;


创建一棵二叉树

int create_bitree(bitree *bt)
{
elemtype    data;
scanf("%d", &data);
if (0 == data) {
*bt = NULL;
} else {
*bt = (bitree)malloc(sizeof(bitnode));
if (!(*bt))
exit(OVERFLOW);
(*bt)->data = data;
create_bitree(&(*bt)->lchild);
create_bitree(&(*bt)->rchild);
}
return OK;
}


二叉树的遍历

//先序
void preorder(bitree bt, int (*visit)(elemtype e))
{
if (bt) {
visit(bt->data);
preorder(bt->lchild, visit);
preorder(bt->rchild, visit);
}
}
//中序
void inorder(bitree bt, int (*visit)(elemtype e))
{
if (bt) {
inorder(bt->lchild, visit);
visit(bt->data);
inorder(bt->rchild, visit);
}
}
//后序
void postorder(bitree bt, int (*visit)(elemtype e))
{
if (bt) {
postorder(bt->lchild, visit);
postorder(bt->rchild, visit);
visit(bt->data);
}
}


二叉树的深度

int get_tree_depth(bitree bt)
{
int ldepth, rdepth;

if (!bt)
return 0;
else if (!bt->lchild && !bt->rchild)
return 1;
else {
ldepth = get_tree_depth(bt->lchild);
rdepth = get_tree_depth(bt->rchild);

return (ldepth > rdepth ? ldepth : rdepth) + 1;
}
}


叶子结点数

int get_num_of_leave(bitree bt)
{
if (!bt)
return 0;
else if (!bt->lchild && !bt->rchild)
return 1;
else
return (get_num_of_leave(bt->lchild) + get_num_of_leave(bt->rchild));
}


释放二叉树

void free_bitree(bitree *bt)
{
if (*bt) {
if ((*bt)->lchild)
free_bitree(&(*bt)->lchild);
if ((*bt)->rchild)
free_bitree(&(*bt)->rchild);
free(*bt);
*bt = NULL;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息