树型结构 :特点为 一对多
概念:
由n个结点组成的有限集
有一个根结点;其他结点只有一个前驱结点,但可以有多个后继结点(一对多)
n = 0时为空树
专业词汇:
叶子结点(终端结点 )只有前驱没有后继
根结点 A
分支节点 B\C\D
结点度 :该结点后继结点的个数
度(默认为广度)
深度:这棵树所对应的层数
广度:这棵树里结点度最大的度
二叉树
树的度(广度)为2 且子节点的位置不能交换的数叫做二叉树
满二叉树
在不增加层数的情况下无法再增加一个结点(叶子结点处于同一层、除叶子结点其他结点的度都为2)
k层满二叉树:
第k层结点个数:2^(k-1);
k层结点总个数:2^k-1;
完全二叉树
满二叉树是完全二叉树,完全二叉树不一定是满二叉树
概念:在满二叉树的基础上,若要增加结点只能从上至下、从左至右依次增加;若要删除结点只能从下至上、从右至左依次删除,则剩下的树为完全二叉树
例:有一棵完全二叉树的总结点个数为4847个,求该二叉树的叶子结点个数
答:2424个
二叉树的遍历
前序遍历
根结点 左子树 右子树 —— A B C E H D F G 深度优先
中序遍历
左子树 根结点 右子树 —— C B H E A F D G 深度优先
后序遍历
左子树 右子树 根节点 —— C H E B F G D A 深度优先
层序遍历
从上至下、从左至右 逐层遍历 —— A B D C E F G H 广度优先
#include "tree.h"
#include "queue.h"char tree[] = "ABC##EH###DF##G##";
int idx = 0;/*创建二叉数*/
TREE_NODE *create_Btree()
{BTDATA_TYPE data = tree[idx++];TREE_NODE *pnode = malloc(sizeof(TREE_NODE));if('#' == data){return NULL ;}pnode ->data =data;pnode ->pl = create_Btree();pnode ->pr = create_Btree();return pnode;
}/*前序遍历*///根左右
void pre_order(TREE_NODE *proot)
{if(NULL == proot){return;}printf("%c",proot->data);pre_order(proot->pl);pre_order(proot->pr);
}
/*中序遍历*///左根you
void mid_order(TREE_NODE *proot)
{if(proot == NULL){return ;}mid_order(proot->pl);printf("%c",proot->data);mid_order(proot->pr);
}
/*后序遍历*/
void end_order(TREE_NODE *proot)
{if(proot == NULL){return ;}end_order(proot->pl);end_order(proot->pr);printf("%c",proot->data);
}
/*层序遍历*/
void level_order(TREE_NODE *proot)
{QUEUE_LIST *plist = creat_link();if(plist == NULL){return;}DATA_TYPE outdata;push_tail_queue(plist,proot);while(!is_empty_queue(plist)){pop_tail_delete(plist,&outdata);printf("%c ",outdata->data);if(outdata->pl != NULL){push_tail_queue(plist,outdata->pl);}if(outdata->pr != NULL){push_tail_queue(plist,outdata->pr);}}printf("===============");queue_destort(plist);
}
/*获取二叉树结点个数*/
int get_tree_nodenum(TREE_NODE *pnode)
{ if(NULL == pnode){return 0;}return get_tree_nodenum(pnode->pl) + get_tree_nodenum(pnode->pr) + 1;
}/*获取二叉树的层数*/
int get_tree_layer_cnt(TREE_NODE *proot)
{if(NULL == proot){return 0;}int layl = get_tree_layer_cnt(proot->pl);int layr = get_tree_layer_cnt(proot->pr);return layl > layr ? layl+1:layr+1;
}/*销毁二叉树*/
void destory_btree(TREE_NODE *proot)
{if(NULL == proot){return;}destory_btree(proot->pl);destory_btree(proot->pr);free(proot);
}