树
来源:互联网 发布:js中undefined null 编辑:程序博客网 时间:2024/05/16 17:21
一、树的定义
树是n(n>=0)个结点的有限集,是一对多的数据结构,N=0叫空树。不可能存在多个根节点,子树一定是互不相交的。
结点拥有的子树称为结点的度。度为0的结点称为叶结点或终端结点;度不为0的结点称为非终端结点或分支结点。除根节点外,分支结点也称为内部结点。树的度是树内各结点度的最大值,如图此树度为3
结点子树的根称为该结点的孩子,该结点称为孩子的双亲。同一个双亲的孩子之间互称为兄弟,双亲在同一层的互为堂兄弟(D,E,F)。
结点的祖先是从根到该节点所经分支上的所有结点(H的祖先D,B,A)
结点的子孙是以结点为根的子树的结点(B的子孙D G H I)
树中结点的最大层次称为树的深度或高度,如图为4
森林是m(m>=0)棵互不相交的树的集合。
如果将树中的结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。
线程结构和树的不同:
二、树的存储结构
⑴双亲表示法
在每个结点中,附设一个指示器指示其双亲结点在数组中的位置
data是数据域,存储结点的数据信息,parent是指针域,存储该结点的双亲在数组中的下标,我们把根结点的parent设为-1
这样的存储结构很容易找到它的双亲结点,但是不利于找结点的孩子和兄弟之间的关系,我们做如下改进
①增加一个结点最左边孩子的域(长子域),没有孩子的结点设为-1,
②增加一个右兄弟域记录右兄弟下标,没有右兄弟设为-1
具体情况可以具体分析。
⑵孩子表示法
每个结点的孩子结点排列起来,以单链表作存储结构。然后将n个头指针组成一个线程表,采用顺序存储结构,放进一个一维数组中。
这里要设立两种结点结构:
一个是孩子链表的孩子结点
一个是表头数组的表头结点
这种表示方法不利于找双亲结点,我们可以在顺序存储结构加上双亲结点
⑶孩子兄弟表示法
设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟
这样其实就把一个复杂的树变成二叉树了。
三、树和森林的遍历方式
⑴树的遍历:
①先根遍历,先访问树的根结点,然后依次先根遍历根的每棵子树,ABEFCDG
②后根遍历,先依次后根遍历每棵子树,然后再访问根结点,EFBCGDA
⑵森林的遍历:
①前序遍历:
先根遍历每棵树, ABCDEFGHJI
②后序遍历:
后根遍历每棵树, BCDAFEJHIG
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- BZOJ 1303: [CQOI2009]中位数图
- Eclispe4.5 servlet web开发_非Eclipse下构建OSGI运行环境
- Windows更新后,chrome无法联网
- undefined和null的区别
- F
- 树
- 【数据结构】中的堆(HeapSort)排序
- 虚拟机搭建CDH-第六讲-安装mysql第一种方法(比较简单)
- XTUOJ1264:Partial Sum(前缀和)
- 《PCL点云库学习&VS2010(X64)》Part 37 FLANN——快速最近邻搜索库
- C++primer 第十二章笔记 初稿
- 学习笔记2-- Activity的什么鬼
- 烟台大学 oj 1006
- C#学习笔记 5 运算符