- 二叉树
(1) 非空二叉树上叶子结点数等于双分支结点数加1;n0=n2+1;
(2) 在一棵二叉树中,所有结点的分支数等于单分支结点数加双分支结点数的2倍;
总分支数=n1+2*n2;
总结点数 = 总分支数+1;
(3) 二叉树的第i层上最多有2的i-1次幂个结点;
(4) 高度为k的二叉树最多有2的k次幂-1个结点;
(5) 具有n个结点的完全二叉树的深度为floor(log2n) + 1 。
(6) 如果对一棵有n个结点的完全二叉树(其深度为floor(log2n) + 1 )的结点按层序编号,则对任一结点i(1≤i≤n)有:
如果i = 1,则结点i是二叉树的根,无双亲;如果i > 1,则其双亲PARENT(i)是结点 floor((i)/2)。
如果2i > n,则结点i无左孩子;否则其左孩子LCHILD(i)是结点2i。
如果2i + 1 > n,则结点i无右孩子;否则其右孩子RCHILD(i)是结点2i + 1 - 二叉树的存储
(1) 顺序存储:适合完全二叉树;
(2)链式存储:
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild; // 左右孩子指针
}BiTNode, *BiTree;
- 遍历
(1) 先序遍历:
void preorder(BTNode *p)
{
if (p!=NULL)
{
visit(p);
preorder(p->lchild);
preorder(p->rchild);
}
}
(2) 中序遍历:
void preorder(BTNode *p)
{
if (p!=NULL)
{
preorder(p->lchild);
visit(p);
preorder(p->rchild);
}
}
(3) 后序遍历:
void preorder(BTNode *p)
{
if (p!=NULL)
{
preorder(p->lchild);
preorder(p->rchild);
visit(p);
}
}