当前位置: 首页> 教育> 大学 > 数据结构 --- 二叉树

数据结构 --- 二叉树

时间:2025/7/10 8:54:05来源:https://blog.csdn.net/m0_63935612/article/details/141987152 浏览次数:0次

一、满二叉树

在一棵二叉树中,如果所有分支节点都存在左子树和右子树,并且所有叶子节点都在同一层上,这

样的二叉树称为满二叉树。

每层节点数量为 2 ^ (n - 1)        (n为层数)

总节点个数为    2 ^ n - 1

二、完全二叉树

 在满二叉树的基础上,从上往下,从左往右增加节点;从下往上,从右往左减少节点

        满二叉树  ====  完全二叉树 

        完全二叉树  ====? 满二叉树

三、二叉树的遍历

创建一个二叉树 (扩展二叉树)

pl(坐指针) Apr(右指针)
#ifndef __TREE_H__
#define __TREE_H__typedef char TDatatype;typedef struct tnode
{TDatatype data;struct tnode *pl;struct tnode *pr;
}tnode_t;tnode_t *create_bin_tree();
void pre_order(tnode_t *proot);
void mid_order(tnode_t *proot);
void behind_order(tnode_t *proot);
int get_tree_node(tnode_t *proot);
int get_tree_layer(tnode_t *proot);
void destroy_tree(tnode_t *proot);
void push_tree(tnode_t *proot);#endif
char tree[] = {"ABEH###G##CF#D##I##"};
int idx;tnode_t *create_bin_tree()
{TDatatype data = tree[idx++];if(data == '#'){return NULL;}tnode_t *pnode = (tnode_t *)malloc(sizeof(tnode_t));if(!pnode)return NULL;pnode->data = data;pnode->pl = create_bin_tree();pnode->pr = create_bin_tree();return pnode;
}

前序遍历:        根        左子树        右子树        ABEHGCFDI

中序遍历:        左子树        根        右子树        HEBGAFDCI

后序遍历:        左子树        右子树        根        HEGBDFICA

层序遍历:从上至下,从左至右,逐层遍历       ABCEGFIHD

已知        前序加中序 ------>还原二叉树

                后序加中序 ------>还原二叉树

四、代码实现 

 1、前序遍历

void pre_order(tnode_t *proot)
{if(NULL == proot)return;printf("%c ",proot->data);pre_order(proot->pl);pre_order(proot->pr);
}

2、中序遍历

void mid_order(tnode_t *proot)
{if(!proot)return ;mid_order(proot->pl);printf("%c ",proot->data);mid_order(proot->pr);
}

3、后序遍历

void behind_order(tnode_t *proot)
{if(!proot)return ;behind_order(proot->pl);behind_order(proot->pr);printf("%c ",proot->data);
}

4、层序遍历

层序遍历中需要用到 队列 知识

void push_tree(tnode_t *proot)
{queue_t *que = create_queue();push_queue(que,proot);while(!is_empty_queue(que))  //判断队列是否为空,空返回1,非空为0{tnode_t *p;pop_queue(que,&p);printf("%c ",p->data);if(p->pl){push_queue(que,p->pl);} if(p->pr){push_queue(que,p->pr);}}printf("\n");destroy_queue(que);
}

5、获取二叉树的节点个数

int get_tree_node(tnode_t *proot)
{if(!proot)return 0;return get_tree_node(proot->pl) + get_tree_node(proot->pr) + 1;
}

6、获取二叉树的层数 

int get_tree_layer(tnode_t *proot)
{if(!proot)return 0;int cntl = get_tree_layer(proot->pl);int cntr = get_tree_layer(proot->pr);return cntl > cntr ? cntl + 1 : cntr + 1;
} 

 7、销毁二叉树

void destroy_tree(tnode_t *proot)
{if(!proot)return;destroy_tree(proot->pl);destroy_tree(proot->pr);free(proot);
}

 

关键字:数据结构 --- 二叉树

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: