关于树的一些概念和术语,有位博主写的很好,可以点下面的链接去看一下
我是链接
二叉树的性质
- 在二叉树的第i层上至多有2j-1个结点(i>=1)
- 深度为k的二叉树至多有2k-1个结点(k>=1)深度为k时至少有k个节点
- 对任何一棵二叉树T,如果其叶子数为n0,度为2的节点为n2,则n0=n2+1
- 具有n个结点的完全二叉树的深度为[log2n]+1([log2n]代表向下取整),例如有12个结点的完全二叉树的深度为[212]+1=3+1=4
- 如果对一棵有n个结点的完全二叉树(深度由性质4可知,为[log2]+1)的每一点进行编号(即从第1层到第[log2]+1,每层从左到右的顺序),则对任一结点i(1<=i<=n)有:
(1). 如果i=1,则结点为根,无双亲,如果i>1,则其双亲结点为[i/2]
(2).如果2i>n,则结点i为叶子结点,无左孩子,否则,其左孩子是结点2i
(3).如果2i+1>n,则结点i无右孩子,否则,其右孩子是结点2i+1
满二叉树
一棵深度为k具有2k-1个结点的二叉树称为满二叉树
特点:
- 每一层上的结点数都是最大结点数
- 叶子结点全部在最底层
完全二叉树
深度为k的具有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中遍号为1-n的结点一一对应时,称之为完全二叉树
特点:
- 叶子只可能在层次最大的两层上
- 对任一结点,如果其右子树的最大层次为i, 则其左子树的最大层次必为i或i+1
将树转换为二叉树
- 加线,在兄弟之间加连线
- 抹线,除左孩子(长子)外,去除结点与其他孩子之间的连线
- 旋转,以树的根结点为中心,顺时针旋转45o
将二叉树转为树
- 加线,若p结点是双亲结点的左孩子,则将p的右孩子,以及右孩子的右孩子…沿分支找到的所有右孩子,都与p用线连起来
- 抹线,将抹掉原二叉树中双亲与右孩子之间的连线
- 调整,将结点按层次排列,形成树结构
可总结为:左孩右右连双亲,去掉原来右孩线
将森林转为二叉树
- 将各棵树分别转换成二叉树
- 将每棵树的根节点用线相连
- 以第一棵树结点为二叉树的根,再以根节点为轴心,顺时针旋转构成二叉树
可总结为:树变二叉根相连
二叉树变为森林
- 抹线,将二叉树中根结点与其右孩子,以及右孩子的右孩子…的连线全部抹去,使之变为孤立的二叉树
- 还原,将孤立的二叉树还原成树
可总结为:去掉原来右孩线,孤立二叉再还原
二叉树的遍历
- 先序遍历
- 中序遍历
- 后续遍历
- 层次遍历
树的遍历(普通树的孩子结点可能有多个,中序遍历无法确定先遍历哪个孩子,后遍历哪个孩子,所以普通树无中序遍历)
- 先序遍历
- 后序遍历
- 层次遍历
森林遍历
将森林看作3部分组成:
- 第一棵树的根节点
- 第一棵树的子树森林
- 其他树构成的森林
则森林的遍历有:
- 先序遍历:先遍历部分1,再遍历部分2,最后遍历部分3
- 中序遍历:先遍历部分2,再遍历部分1,最后遍历部分3