二叉树的遍历
先序递归遍历
void PreOrder(BTREE BT)
{
if(!isEmpty(BT))
{
visit(Data(BT));
PreOrder(lchild(BT));
PreOrder(rchild(BT));
}
}
中序递归遍历
void InOrder(BTREE BT)
{
if(!isEmpty(BT))
{
InOrder(lchild(BT));
visit(Data(BT));
InOrder(rchild(BT));
}
}
后序递归遍历
void PostOrder(BTREE BT)
{
if(!isEmpty(BT))
{
PostOrder(lchild(BT));
PostOrder(rchild(BT));
visit(Data(BT));
}
}
层序遍历,会用到队列
基本思想:按层次顺序遍历二叉树的原则是先被访问的左,右儿子结点先被访问,
因此,在遍历过程中需利用具有先进先出特性的队列结构。
实现步骤:
1.队列Q初始化;
2.如果二叉树非空,将根指针入队;
3.循环直到队列Q为空
3.1 q=队列Q的队头元素出队;
3.2 访问结点q的数据域
3.3若结点q存在左孩子,则将左孩子指针入队
3.4若结点q存在右孩子,则将右孩子指针入队。
void LeverOrder(BTREE root)
{
Queue Q;
BTREE q;
MakeNull(Q);
if(root == NULL)
{
return ;
}
EnQueue(root,Q);
while(!isEmpty(Q))
{
q=Front(Q);
DeQueue(Q);
visit(Data(q));
if(q->lchild!=NULL) EnQueue(q->lchild,Q);
is(q>rchild!=NULL) EnQueue(q->rchild,Q);
}
}
先序遍历非递归算法
核心步骤:
1.栈S初始化
2.循环直到root为空且栈S为空
2.1当root不空时循环
2.1.1输出root->data;
2.1.2将指针root的值保存到栈中
2.1.3继续遍历root的左子树
2.2如果栈S不空,则:
2.2.1将栈顶元素弹出至root;
2.2.2准备遍历root的右子树
void PreOrder(BTREE root)
{
stack S;
MakeNull(S);//初始化栈
while(!isEmpty(root) || !S.isEmpty())
{
while(root!=NULL)
{
visit(Data(root));
push(root,S);
root=root->lchild;
}
while(!S.isEmpty)
{
root=S.Top();
Pop(S);
root=root->rchild;
}
return;
}
中序遍历非递归算法
核心步骤:
1.栈S初始化;
2.循环直到root为空且栈S为空
2.1当root不空时循环
2.1.1将指针root的值保存到栈中;
2.1.2继续遍历root的左子树
2.2如果栈S不空,则:
2.2.1 将栈顶元素弹出至root;
2.2.2输出root->data;
2.2.3准备遍历root的右子树
void InOrder(BTREE root)
{
stack S;
MakeNull(S); //递归工作栈
while(root!=NULL || !isEmpty(S))
{
while(root!=NULL)
{
push(root,S);
root=root->lchild;
}
while(!isEmpty(S))
{
root=top(S);
pop(S);
visit(Data(root));
root=root->rchild;
}
}
}
后序遍历非递归算法
核心步骤:
1.栈S初始化;
2.循环直到root为空且栈S为空
2.1当root不空时循环
2.1.1将root连同标志flag=1入栈;
2.1.2继续遍历root的左子树;
2.2当栈s非空且栈顶元素的标志为2时,出栈并输出栈顶结点。
2.3若栈非空,将栈顶元素的标志改为2,准备遍历栈顶点的右子树。
void PostOrder(BTREE root)
{
stack S;
MakeNull(S);
while(root!=NULL || !isEmpty(S))
{
while(root!=NULL)
{
S.top++;
S[S.top].ptr=root;
S[S.top].flag=1;
root=root->lchild;
}
while(!isEmpty(S) && S.[S.top].flag==2)
{
count<<S.[S.top].ptr->data;
pop(S);
}
while(!isEmpty(S))
{
S[S.top].flag=2;
root=S[S.top].ptr->rchild;
}
}
return;
}