数据结构与算法:树
树
树状图是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。树状图有和树相同的结构,树有根、枝、叶,而树状图也有根——根节点、枝——非叶子节点的子节点、叶——叶子节点。每颗树只会有一个根,枝能衍生出新的枝和叶,而叶是最后的一个部位,同理树状图也一样。
树的常用词:
-
-
节点的度:即节点的子节点数量,当节点含有俩个子节点时,那它的度就为2
-
权值:节点的值
-
根节点:树的第一个元素,它没有父节点
-
父节点:若一个元素含有子节点,则它就是该子节点的父节点
-
子节点:若一个元素含有父节点,则它就是该父节点的子节点
-
叶子节点:若一个元素含有父节点,但它没含子节点,那它就是一个叶子节点
-
子树:若一个元素含有父节点,则该节点和该节点下所有子节点(包括子节点的子节点)组成的一个树就是父节点的子树
-
森林:由m(m>=0)棵互不相交的树的集合称为森林
-
树的层级:根节点为第一层,它的子节点为第二层,该子节点的子节点为第三层,以此类推
-
树的度:树中所有节点度的最大值
-
树的高度或深度:即树的最大层级
-
路径:从根节点找到某一节点的路线
树的种类
无序树:树中任意节点的子结点之间没有顺序关系,这种树称为无序树,也称为自由树;
有序树:树中任意节点的子结点之间有顺序关系,这种树称为有序树;
二叉树:每个节点最多含有两个子树的树称为二叉树;
满二叉树:叶节点除外的所有节点均含有两个子树的树被称为满二叉树
完全二叉树:有2^k-1(k:层级)个节点的满二叉树称为完全二叉树
哈夫曼树(最优二叉树):带权路径最短的二叉树称为哈夫曼树或最优二叉树;
树的表达方式
图像表达法
即通过图像的方式直接表达出各节点的关系
符号表达法
用括号先将根结点放入一对圆括号中,然后把它的子树由左至右的顺序放入括号中,而对子树也采用同样的方法处理;同层子树与它的根结点用圆括号括起来,同层子树之间用逗号隔开,最后用闭括号括起来。如上面树状图可以表示为:( A ( B ( C , D ) , E ( F ) ) )
遍历表达法
前序遍历:先输出父节点,再遍历左子树和右子树。如上面树状图用前序遍历表达为:ABCDEF
中序遍历:先遍历左子树,后输出父节点,再遍历右子树。如上面树状图用中序遍历表达为:CBDAEF
后序遍历:先遍历左子树和右子树,再输出父节点。如上面树状图用后序遍历表达为:CDBFEA
为什么要使用树结构?
数组结构
优点:通过下标方式来访问数据,速度快。对于有序数组还可以用二分查找等查找算法来加快速度。
缺点:当向数组中插入或删除数据时,数组需要整体移动,效率较低。
链表结构
优点:插入和删除的效率对比数组结构有很大的提升。如添加时只需直接添加到链表最后,而删除时也只需要移动单个数据即可。
缺点:查找的效率仍然很低。如从链表中查找某个值时,需从链表头开始遍历。
树结构
树结构可以很好提升读取、存储的效率。比如二叉顺序树,即提高了查找的效率,也可以保证添加、删除、修改的速度。