树
来源:互联网 发布:python黑帽子 百度云 编辑:程序博客网 时间:2024/05/17 07:13
2017年5月25日 16:45:10
度:结点拥有的子树数成为结点的度
深度/高度:树中结点的最大层次
如果将书中结点的各子树看成从左到右是有次序的,不能互换的,则称该树为有序树
树的表示方法:
(1)双亲表示法:在每个结点中,附设一个指示器指示其双亲结点在数组中的位置
(2)孩子表示法:把每个结点的孩子结点排列起来,以单链表做存储结构,则n个结点
有n个孩子链表,如果是叶子结点则此单链表为空。然后n个头指针又
组成一个线性表,采用顺序存储结构,存放一个一维数组中
每个结点有多个指针域,其中每个指针指向一颗子树的根节点
因为每个结点的度不同,因此孩子个数不同,有两种方法解决
1.指针域的个数等于树的深度。这样会使很多指针域为NULL
2.每个结点指针域的个数等于结点的度。但是各个结点的链表是不相同的结构,
加上要维护结点度的数值,在运算上就会带来时间上的损耗
(3)双亲孩子表示法
(4)孩子兄弟表示法:任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右
兄弟如果存在也是唯一的。因此,我们设置两个指针,分别指向该
结点的第一个孩子和此结点的右兄弟。
最大的好处:将一颗复杂的树变成了一颗二叉树
二叉树的特点:
1.每个结点最多有两棵子树
2.左子树和右子树是有顺序的,次序不能任意颠倒
3.即使树中某结点只有一棵子树,也要区分它是左子树还是右子树
特殊的二叉树:
1.斜树:所有的结点都只有左子树,叫左斜树,同理还有右斜树
2.满二叉树:所有结点都存在左子树和右子树,并且所有叶子都在同一层上
3.完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果编号为i的结点与同样深度的满
二叉树中编号为i的结点在二叉树中的位置完全相同,则成为完全二叉树
特点:(1)叶子结点只能出现在最下两层
(2)最下层的叶子一定集中在左部连续位置
(3)倒数两层,若有叶子结点,一定都在右部连续位置
(4)如果结点度为1,则该结点只有左孩子,即不存在只有右子树的情况
(5)同样结点树的二叉树,完全二叉树的深度最小
二叉树的性质:
1.在二叉树的第i层上至多有2^(i-1)个结点
2.深度为k的二叉树至多有2^k-1个结点
3.对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点树为n2,则n0 = n2 + 1
4.具有n个结点的完全二叉树的深度为[logn]+1
5.如果对一棵有n个几点的完全二叉树的结点按层序编号,对任一结点i:
(1)如果i = 1,则结点i是二叉树的根,无双亲;如果 i > 1,则其双亲是结点[i / 2]
(2)如果2i > n, 则结点i无左孩子,否则其左孩子是结点2i
(3)如果2i + 1 > n,则结点i无右孩子;否则其右孩子是结点2i + 1
线索二叉树:
指向前驱和后继的指针成为线索,加上线索的二叉链表称为线索链表,相应的二叉树就称为线索二叉树
后继:下一个要读取的结点。 前驱:上一个读取的结点
线索化:对二叉树以某种次序遍历使其变为线索二叉树的过程
在每个结点增加两个标志位,分别表明:结点的lchild是指向左孩子还是前驱,rchild是指向右孩子还是后继
中序遍历线索化的递归函数代码:
BiThrTree pre; //全局变量,始终指向刚刚访问过的结点
void InThreading(BiThrTree p)
{
if(p)
{
InThreading(p->lchild);
if(!p->lchild)
{
p->LTag = Thread;
p->lchild = pre;
}
if(! p->rchild)
{
p->RTag = Thread;
p->rchild = p;
}
pre = p;
InThreading(p->rchild);
}
}
遍历的代码:
//这里是有头结点的二叉树,头结点的左子树为根节点
Status InOrderTraveres_Thr(BiThrTree T)
{
BiThrTree p;
p = T->lchild;
while( p != T)
{
while(p->LTag == Link) //有左孩子,无前驱时,循环到中序序列的第一个结点
{
p = p->lchild;
}
printf("%c",p->data);
while(p->RTag == Thread && p->rchild != T) //有后继,切不是头
{
p = p->rchild;
printf("%c",p->data);
}
p = p->rchild;
}
return OK;
}
赫夫曼树:
从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称为路径长度
树的路径长度就是从树根到每一个结点的路径长度之和
带路径长度WPL最小二叉树成为赫夫曼树,即最优二叉树
赫夫曼算法:
1.根据给定的n个权值{w1,w2...}构成n棵二叉树的集合 F = {T1,T2...},其中每颗二叉树Ti
中只有一个带权为wi根节点,其左右子树均为空
2.在F中选取两科根节点的权值最小的树作为左右子树构成一棵新的二叉树,且置新的二叉树的根
结点的权值为其左右子树上根结点的权值之和
3.在F中删除这两棵树,同时将新得到的二叉树加入F中
4.重复2和3步骤,直到F只含一棵树为止
阅读全文
0 0
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- OpenCV中的SVM参数优化
- 【bzoj2821】作诗(Poetize)
- android--利用Service进行文件下载
- 仿小米天气15天趋势预报
- 漂亮的git log显示
- 树
- MATLAB与NumPy的对比
- 关于在Fragment中使用多组ViewPager+TabLayout出现的部分Fragment不显示问题
- 数字,字母,汉字的校验
- Python进阶-函数默认参数
- iOS 根据字符串计算label高度
- 大数据学习记录(day2)-Hadoop概述
- kotlin入门学习(一)
- 基于OpenAS2 V2.3.0的使用心得 一 环境搭建及启动