前导知识:
结点的层次:规定根结点在1层, 其它任一结点的层数是其父结点的层数加1。
树的深度:树中最大的结点层次。(从根节点往下)
二叉树定义:一个有穷的结点集合,这个集合可以为空;若不为空,则它是由根结点和称为其左子树和右子树的两个不相交的二叉树组成。
二叉树具有5种基本形态:
二叉树的几个重要性质:
(1)一个二叉树第i层的最大结点数为:
(2)深度为k的二叉树拥有的最大结点数为:
(3)对任何非空二叉树 T,若n0表示叶结点的个数、n2是度为2的非叶结点个数,那么两者满足关系n0 = n2 +1。
二叉树的存储结构—链表存储:
typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{ ElementType Data; BinTree Left; BinTree Right; }
二叉树的遍历:
递归写法,以先序遍历为例,采用堆栈:
void PreOrderTraversal( BinTree BT ) {
if( BT ) {
printf(“%d”, BT->Data);
PreOrderTraversal( BT->Left );
PreOrderTraversal( BT->Right );
}
}
非递归写法,以先序遍历为例:
void InOrderTraversal( BinTree BT ) {
BinTree T=BT;
Stack S = CreatStack( MaxSize ); /*创建并初始化堆栈S*/
while( T || !IsEmpty(S) ){
while(T){ /*一直向左并将沿途结点压入堆栈*/
printf(“%5d”, T->Data); /*(访问)打印结点*/
Push(S,T);
T = T->Left;
}
if(!IsEmpty(S)){ /*栈不为空*/
T = Pop(S); /*结点弹出堆栈*/
T = T->Right; /*转向右子树*/
}
}
}
层序遍历,采用队列:
void LevelOrderTraversal ( BinTree BT ) {
Queue Q;
BinTree T;
if ( !BT ) return; /* 若是空树则直接返回 */
Q = CreatQueue( MaxSize ); /*创建并初始化队列Q*/
AddQ( Q, BT );
while ( !IsEmptyQ( Q ) ) {
T = DeleteQ( Q );
printf(“%d\n”, T->Data); /*访问取出队列的结点*/
if ( T->Left ) AddQ( Q, T->Left );
if ( T->Right ) AddQ( Q, T->Right );
}
}
示例:
层序遍历=>13,10,15,9,12,14,16