二叉树
First. 二叉树和二次树不同,二次树至少有一个结点的度为2,二叉树没有这个要求。
二次树不区分左右子树,二叉树严格区分左右子树
满二叉树: 所有的分支结点都有左右孩子结点,叶子结点在最下面一层
非空满二叉树特点:1.叶子结点在最下面一层 2.只有度为0和2的点
完全二叉树:一层一层从左往右地排,刚好没排完.。所以若是存在度为1的结点,只有一个
二叉树的性质:
-
非空二叉树上的叶子结点数等于双分支结点数+1.
证明:设二叉树叶子结点数为n0,单分支结点数为n1,双分支结点数为n2,则
总结点数=n0+n1+n2
总度数=2n2+n1
但是,由树的性质,结点数=总度数+1
化简可得,n0=n2+1
-
非空二叉树的第i层最多有wi-1个结点
-
高度为h的二叉树最多有2h-1个结点
-
完全二叉树中编号为i(i>=1&&i<=n,n为结点数)的结点有以下性质:
(1)若2i<=n,则为分支结点,否则为叶子结点(由第一条双分支结点与叶子结点的数量关系可得,因为完全二叉树只有双方分支结点和叶子结点,至多有一个单亲结点)
(2)若n为奇数,则没有单分支结点。若n为偶数,则有一个单分支结点
(3)若编号为i的结点有左孩子结点,则左孩子结点编号为2i,若有右孩子结点,则编号为2i+1。
(4)除根节点外,若一个结点编号为i,则双亲结点编号为i/2(向上取整)
-
具有n个结点的完全二叉树高度为log2(n+1)(向上取整)或log2n+1。
树转换为二叉树:
1.在所有兄弟结点之间加一条线
2.树中的每个结点只保留与长子之间的连线
3.以根节点为周线,将树顺时针旋转45°
二叉树转为树:
1.若某结点是其双亲结点的左孩子,则将它的右孩子、右孩子的右孩子与双亲连接起来。
2.删除所有双亲结点与右孩子的连线
3.以根结点为轴心,逆时针转动45°
二叉树的存储结构
顺序存储结构:
1.对于完全二叉树,按照编号顺序存储即可
2.对于一般的二叉树,保留空结点的位置,依旧按照编号填入,空结点的数据置一个特殊的符号即可
typedef ElemType SqBinTree[MaxSize];
若空结点非常多,则会造成空间大量浪费。
顺序存储查找一个结点的双亲和孩子结点也很方便(参见二叉树的性质)
链式存储结构
二叉链
typedef struct node
{
ElemType data;
struct node * lchild;
struct node * rchild;
}BTNode;
为了查找双亲结点方便,有时会加入一个指针域 struct node * parent