1.二叉树的概念:
二叉树是一种非线性的数据结构,每个结点最多有两个子树,且有左右之分。
满二叉树:深度为k的二叉树有2^k - 1个结点的二叉树。
完全二叉树:如果将一个二叉树和满二叉树分别按从上到下,从左到右的顺序依次进行编码,若该二叉树中的每个结点编号都与满二叉树的编号一一对应,则称该二叉树为完全二叉树。
2.性质:
a.二叉树的第i层,最多拥有2^(i-1)个结点;
b.深度为k的二叉树,左右拥有2^k - 1个结点;
c.任意一个二叉树,度(子树个数)为0的结点个数n0与度为2的结点个数n2之间的关系为:n0 = n2 + 1;
d.具有n个结点的完全二叉树,其深度为int(log2n) + 1;
e.如果对一个完全二叉树按从上到下,从左到右的顺序依次进行编号,对任何结点i(1 <= i <= n)都有:
(1)if(i ==1),i为根结点,无双亲;if(i>1),则i的双亲结点为int (i/2);
(2)if(2i>n),则i没有左子树,if(2i <= n),则i的左子树为2i;
(3)if(2i+1>n),则i没有右子树,if(2i<=n),则i的右子树为2i+1;
3.二叉树的存储结构:
a.顺序存储,按照完全二叉树的编号依次放在连续的存储单元中
b.链式存储,二叉树的抽象数据类型:
struct btnode
{
datatype data;
btnode *lchild, *rchild;
};
4.遍历二叉树;
a.先序遍历,访问次序:根节点-左子树-右子树
void preorder(btnode *bt)
{
if(bt)
{
visit(bt);
preorder(bt->lchild);
preorder(bt->rchild);
}
}
b.中序遍历,访问次序:左子树-根节点-右子树
void preorder(btnode *bt)
{
if(bt)
{
preorder(bt->lchild);
visit(bt);
preorder(bt->rchild);
}
}
c.后序遍历,访问次序:左子树-右子树-根节点
void preorder(btnode *bt)
{
if(bt)
{
preorder(bt->lchild);
preorder(bt->rchild);
visit(bt);
}
5.二叉树的线索
概念:二叉树的链式存储只能直接访问到其结点的左右子树,不能在某种遍历序列中直接访问其前驱和后继,而正是利用二叉链中的空指针域来实现这一功能,叫做二叉树的线索。