树,顾名思义,形状就是一个树的样子,有很多分叉,自我感觉是一个有多个分叉的链表。
树的结构以及基本概念还是比较复杂,不像前面的数据结构,所以请大家耐心看完基础概念。
1.基本概念
我们看什么都得从根源开始吧,所以我们从树的根部(root)开始,把处于最上方(或者最底部的)结点叫做根结点。在这里就是A结点。与当前结点直接相连的结点叫做这个结点的子结点(child),相反的话,A就是B,C的父结点(parent)。
继续向下延伸,根结点下面有别的结点,那么一个结点的子结点个数就叫做这个结点的度(degree),比如A的度是2,C的度是3,而当一个结点的度为0的时候,这个结点就叫做叶子结点(leaf),相当于一个树枝到了头就是叶子了。
每个结点下面延伸下去的结点都可以构成一个子树(Subtree),对A而言,B以及后面的与B相连的结点都叫做A的一棵子树。
每个结点都会有一个层次(level),其实就是这个结点从上到下所处的层数,比如A就是层次为一,B就是层次为2,很好理解,树的最大层次就是树的深度(depth),这棵树就是4。
如果几个结点共用一个父结点,那么这些结点就是兄弟结点(sibling),B和C就是兄弟结点;而从根结点开始到某个结点的路径上所有的结点都是这个结点的祖先结点(ancestor),比如A,B,D都是I的祖先结点。
2.二叉树介绍&森林
二叉树简单来说就是最大度不超过2的树,对于每个结点而言,分为左子树和右子树,不能颠倒。
如果一个二叉树全部的度都为2,而且所有叶子结点的层次都相同,那么这种二叉树就叫作满二叉树;如果所有叶子结点的层次都相同,但是最后一层有空缺,而且所有叶子结点都是按照顺序排列的(中间不会出现跳跃,先左后右,而不是直接跳到右),这种二叉树叫做完全二叉树。(其实下图的N结点应该是G的左子树才更正确)
森林其实就是n个不相交的树构成的集合,森林顾名思义就好了。
3.树,二叉树,森林之间的转换
听这个的时候感觉不知道意义何在,所以就搜了一下,这是知乎上的一个回答,大家可以参考一下,这是原文链接:https://zhuanlan.zhihu.com/p/667363962
普通树与二叉树转换
普通树每个结点的度有可能大于2,转换为二叉树时,遵循这样的原则:如果一个结点有兄弟结点,先将所有兄弟结点连接起来(橙色线)。
然后,对于每一个层次,除了最左边的结点和它的父结点之间的黑线(比如B和A)以外,它的兄弟结点与父结点之间的黑线(比如F与A,C与A)全部去除(本树中,还有就是B-E,F-L,C-G,D-H),然后,所有左端的结点(B,D,K,M,I)全部作为子树的根结点,橙色线变成向右方向,黑色线变成向左方向,二叉树就完成了。
如果二叉树转换为普通树的话,倒过来,只需要把所有向右的线变成水平,再补齐父结点与子结点之间的线,再去除水平线就好了。
森林与二叉树转换
森林转换为二叉树的时候,第一步,是把所有森林里的树按照前面说的方法转换为二叉树;
第二步,按照顺序,把后面二叉树的根结点依次连接到前一个二叉树根结点的右侧,作为一个右子树。(注意,从普通树转换而来的二叉树,根结点一定是没有右子树的,只有有兄弟结点的结点才会有右子树)
先转换为二叉树(下图)
再把二叉树依次连接,作为右子树(下图),就完成了森林向二叉树的转换
(红色线是不同树之间的连接线)
总结一下,如果一个二叉树的根结点只有左子树,那它就转换为普通树;如果左右子树都有,那应该转换为森林。