一,树
1.概念——非线性数据结构;一般而言一个树会有一个根节点,向下延申出若干个子节点,每个末端的子结点被称为叶子节点
2.有根树——有根树存在一个根节点root。基于习惯,我们往往会把树倒过来画,根节点在最上面。
p的祖先:p及p上面的点;
p的后代:p及p下面的点 ;
结点深度:往上走走几次能走到根;
树的深度:它从上往下有多少层;
二,二叉树
1.对于每一个结点,它拥有的子节点的个数,称为这个节点的度.所有节点的度不超过2的树成为二叉树;(引申出p叉树——所有节点的度不超过p的树)
2. 每个二叉树的节点最多只会有两个子节点,他的两个子节点一般会被称为左右儿子,两个子树一般会被称为左右子树。当然,左右儿子甚至根节点本身都有可能缺失(如下图右侧)(一个节点都没有可以称之为空二叉树)。
3.具有相同节点深度的二叉树位于同一层
3. (1)完全二叉树:除了最后一层外其他层的节点个数全满,而且最后一层的节点从左到右排列直到最后一个节点。(最后一层点的个数范围是[1 , ],最多就是一个满二叉树)
[注]深度为h的完全二叉树最少有 个节点,最多有
- 1 个节点
(2)满二叉树 :所有层的节点全满
[注]深度为h的完全二叉树有 - 1 个节点
三,完全二叉树的存储,建立
——————例题一
1.存储
(1)一般会以数组的[1]位置为根节点建立二叉树;
(2)数组的[t]位置的左儿子和右儿子对应的位置分别为[2t]和[2t+1],父亲节点的位置为[t/2](做儿子。
(3) 节点按从上到下从左到右进行标号(数组存储方式及二叉树图像如下图)
2.建立
用递归的方式建树
void Build(int t) //建立以t为根的子树
{
UpdateData(t);//更新t节点的数据(包括是否存在)
Build(t + t);//如果子节点存在,建立左儿子,右儿子
Build(t + t + 1);
}