二叉树
n(n>=0)个结点的有限集合:(五种形态)
1.或者为空二叉树,n=0;
2.或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。
3.每个结点最多有2棵子树
4.左右子树有顺序
特殊二叉树
一.斜树
二.满二叉树:1.分支结点都存在左右子树 2.叶子都在同一层 3.非叶子结点的度一定为2 4.相同深度二叉树中满二叉树结点个数最多,叶子树最多
三.完全二叉树:编号与同高度的满二叉树一一对应。
1.叶子结点只可能在层次最下面的两层出现,集中在左部连续位置;
2.若有度为1的结点,只可能有一个,且该结点只有左孩子没有右孩子;
3.同样结点树的二叉树,完全二叉树的深度是最小的。
二叉树的数学等式
1.非空二叉树上叶子结点数等于度为2的结点树加1;
2.非空二叉树上第k层至多有2k-1个结点(k>=1);
3.高度为H的二叉树至多有2H-1个结点(H>=1)
4.具有N个(N>0)的结点的完全二叉树的高度为[log2(N+1)]或[log2N+1];
遍历二叉树
递归先序遍历
void PreOrder(BiTree T){ if(T!=NULL){ printf("%c",T->data); //访问根结点 PreOrder(T->lchild); //递归遍历左子树 PreOrder(T->rchild); //递归遍历右子树 } }
递归中序遍历
void InOrder(BiTree T){ if(T!=NULL){ InOrder(T->lchild); //递归遍历左子树 printf("%c",T->data); //访问根结点 InOrder(T->rchild); //递归遍历右子树 } }
递归后序遍历
void PostOrder(BiTree T){ if(T!=NULL){ PostOrder(T->lchild); //递归遍历左子树 PostOrder(T->rchild); //递归遍历右子树 printf("%c",T->data); //访问根结点 } }
哈夫曼树
权:树中结点相关的数据。
路径长度:从树的某个结点到另一个结点之间的分支数目(经过的边数)。
带权路径长度:从树的根结点到任意结点的路径长度与该结点上权值的乘积。
树中所有叶结点的带权路径长度之和=该树的带权路径长度 即WPL。