第五章小结
第五章的内容是树以及二叉树。
1、树的定义:1)有且只有一个根结点。 2)除根结点以外的结点互不相交。
2、树的基本术语:
1)结点
2)结点的度:结点拥有的子树
3)树的度:各结点度的最大值
4)叶子
5)树的深度:树中结点的最大层次
6)完全二叉树:在存储时可通过对编号的计算找到父、子结点的对应编号
7)满二叉树(深度为K,且含有2的k次方-1个结点)
3、二叉树(结构最简单、规律性强,所有树都可以化成唯一的二叉树)
1)二叉树每个结点至多有两颗子树
2)性质:第i层至多有2的i-1次方个结点;深度为k的二叉树至多有2的k-1次方个结点;对任意一颗二叉树其终端结点为n0,度为2的结点树为n2,则n0=n2+1;
4、二叉树的存储结构(结点间的关系蕴含在存储位置 不容易实现增加删除)
1)顺序存储结构(线性,某个结点的父/子结点,按照完全二叉树down right 的编号利用下标计算)
但是遇到稀疏的树,会造成空间的极大浪费
2)链式存储结构(在含有n个结点的二叉链表中必有2n个链域,有n-1个非空,则有2n-(n-1)个空链域)
//结点的定义 typedef struct bitnode{ telemtype data; struct bitnode *lchild,*rchild; //递归 }bitnode, *bitree;
5、遍历
1)先序遍历 (根 左 右)
void preorder( bitree t ){ if ( t == null ) return; cout<< t->data <<" "; preorder ( t->lchild ); preorder ( t->rchild ); }
2)中序遍历 (左 根 右)
3)后序遍历 (右 左 根)
4)层次遍历
void level (bitree t){ queue q; bitree p; while(!q.empty()){ p=q.pop(); if(p!=null){ cout<<p->data<<" "; q.push(p->lchild); q.push(p->rchild); } } } //用队列遍历
6、二叉树的建立
void creatbitree(bitree &t){ cin>>ch; if (ch=='#') { t=null; return;//} else { t=new bitnode; t->data=ch; createbitree (t->lchild); createbitree (t->rchild); } }
7、树的存储结构
1)双亲表示法:需要找父节点的
2)孩子表示法
3)孩子兄弟表示法(左孩子右兄弟)
8、哈夫曼树(最优树 带权路径长度最短的树)
构造:1)根据n个权值构造n棵二叉树
2)选取最小的权值作为左右子树构成一颗新的二叉树,且置新的二叉树的根节点的权值为左右子树的权值之和
3)删除原来的两棵树,并将新的二叉树加入
4)重复操作直到最后只剩一棵树