6.37③ 試直接利用棧的基本操作寫出先序遍歷的非遞迴 形式的演算法
阿新 • • 發佈:2019-02-20
6.37③ 試直接利用棧的基本操作寫出先序遍歷的非遞迴
形式的演算法(提示:不必按3.3.2節介紹的從遞迴到非遞迴
的方法而直接寫出非遞迴演算法)。
要求實現下列函式:
void PreOrder(BiTree bt, void (*visit)(TElemType));
/* 使用棧,非遞迴先序遍歷二叉樹bt, */
/* 對每個結點的元素域data呼叫函式visit */
二叉連結串列型別定義:
typedef struct BiTNode {
TElemType data;
BiTNode *lchild,*rchild;
} BiTNode, *BiTree;
可用棧型別Stack的相關定義:
typedef BiTree SElemType; // 棧的元素型別
Status InitStack(Stack &S);
Status StackEmpty(Stack S);
Status Push(Stack &S, SElemType e);
Status Pop(Stack &S, SElemType &e);
形式的演算法(提示:不必按3.3.2節介紹的從遞迴到非遞迴
的方法而直接寫出非遞迴演算法)。
要求實現下列函式:
void PreOrder(BiTree bt, void (*visit)(TElemType));
/* 使用棧,非遞迴先序遍歷二叉樹bt, */
/* 對每個結點的元素域data呼叫函式visit */
二叉連結串列型別定義:
typedef struct BiTNode {
TElemType data;
BiTNode *lchild,*rchild;
} BiTNode, *BiTree;
可用棧型別Stack的相關定義:
typedef BiTree SElemType; // 棧的元素型別
Status InitStack(Stack &S);
Status StackEmpty(Stack S);
Status Push(Stack &S, SElemType e);
Status Pop(Stack &S, SElemType &e);
Status GetTop(Stack S, SElemType &e);
void PreOrder(BiTree bt, void (*visit)(TElemType))
/* 使用棧,非遞迴先序遍歷二叉樹bt, */
/* 對每個結點的元素域data呼叫函式visit */
{
//把結點壓入棧中是為了方便訪問結點的右結點
BiTree p = bt;
Stack s;
InitStack(s);
while(p || !StackEmpty(s)){
if(p){
visit(p->data);
Push(s, p);
p = p->lchild;
}else{
Pop(s, p);
p = p->rchild;
}
}
}