一.层次遍历:
算法思想:
1.初始化一个辅助队列
2.根结点入队
3.若队列非空,则队头结点出队,访问该结点,并将其左右孩子插入队尾
4.重复3直到队列为空
//二叉树结点(链式存储)
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//链式队列结点
typedef struct LinkNode{
BiTNode *data; //存指针而不是结点
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
}LinkQueue;
//层序遍历
void LevelOrder(BiTree T){
LinkQueue Q; //由于不确定树的结点有多少,我们用链队列
InitQueue(Q); //初始化辅助队列
BiTree p;
EnQueue(Q,T); //根结点入队
while(!IsEmpty(Q)){
Dequeue(Q,p); //队头结点出队
visit(p); //访问出队结点
if(p->lchild!=NULL)
Enqueue(Q,p->lchild); //左孩子入队
if(p->rchild!=NULL)
Enqueue(Q,p->rchild); //右孩子入队
}
}
二.由遍历序列构造二叉树:(手算)
只给出一课二叉树的 前/中/后/层 序遍历的一种,不能唯一确定一棵二叉树。
中序+任意一种遍历方式可以确定唯一一棵二叉树。
关键是找到根结点。
由于二叉树有n+1个指针链域,可用来记录前驱后继信息。