二叉树

来源:互联网 发布:linux查看进程端口 编辑:程序博客网 时间:2024/06/11 18:07

树的一些概念:(有些博客是错的,故此记一下)

树中节点

n的高:n到一片树叶最长路径的长,树高等于根高,叶子高为0;

n的深度:从根到n的唯一路径的长,根深度为0,树深等于最深的叶子的深度

深度等于树高(数值上),注意区分,二者不等同;


二叉树性质:

1、非空二叉树的第n层上至多有2^(n-1)个元素。(n从1开始)

2、深度为h的二叉树至多有2^(h+1)-1个结点。


二叉树

每个节点都不能有多于两个的儿子;

 

满二叉树:

一颗深度为k且有2^(k+1)-1个结点的二叉树称为满二叉树(回顾二叉树的性质,每个位置都填满了,这就是满的意思)。

       除叶子结点外的所有结点均有两个子结点。节点数达到最大值。所有叶子结点必须在同一层上。

      

完全二叉树:

       若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(深度k-1的节点要不无叶子节点,要不至少含有左叶子节点)


存储结构

顺序存储:保存在数组中,数组的每一个元素是一个结构体,指明了元素值,左右子节点的位置(在数组中的下标),这种方法据说占空间,我觉得主要是难扩展,比较非主流

链式存储:保存在类似链表的结构中,每个节点也是一个结构体,指明了元素,左右子节点的指针;


递归实现二叉树的遍历:



示例代码:
#include using namespace std;typedef struct node{    char inode;    node *left;    node *right;}NODE ,*PNODE;void preout(PNODE tr)//前序{    if(tr!=NULL)    {        coutleft);        preout(tr->right);    }}void midout(PNODE tr)//中序{    if(tr!=NULL)    {        midout(tr->left);        coutright);    }}void finout(PNODE tr)//后序{    if(tr!=NULL)    {        finout(tr->left);        finout(tr->right);        coutc;    if(c=='%')        *tr=NULL;    else    {        *tr=new NODE;        (*tr)->inode=c;        creatree(&(*tr)->left);        creatree(&(*tr)->right);    }    //cout<inode << endl;    return 0;}

结果:第一行为输入利用前序遍历生成树,其余为前,中,后序输出
无叶子节点输入'%'


原创粉丝点击