(1.2.5.1)ツリーの遍歴アルゴリズム
3761 ワード
(1)「先、中、後」遍歴アルゴリズムの統一再帰表記
注意:結合中先、中後、中層はいずれも二叉木の構造を確定することができる.
(2)「先、中、後」遍歴アルゴリズムの非再帰的な書き方:スタック--左圧スタック、退スタック右
先:左側は絶えずスタックを葉まで押して、空いたらスタックを返して右に行って、左側は絶えずスタックを押します.スタック時出力
日:左側は絶えず葉までスタックを押して、空いていたら右にスタックを返して、左側は絶えずスタックを押します.バックスタック時出力
後:左側は葉までスタックを押し続け、空またはスタックにアクセスし、右側は葉までスタックを押し続け、空またはスタックにアクセスし、スタックを右に返します.セカンドスタック時出力
中序遍歴非再帰実装:ルートノードはスタックに切断され、左に遍歴する.左にできない場合は、スタックを返し、出力し、右に遍歴します.
void InOrderTraverse(BiTree T)/非再帰中序遍歴{
stack Stack;
if(!T)
{
printf(「空の木!」
return;
}
while(T || !Stack.empty())
{
while(T)
{
Stack.push(T);
T=T->lchild;
}
T=Stack.top();
Stack.pop();
printf("%c",T->data);
T=T->rchild;
}
}
先序遍歴非再帰実現:出力、ノードと絶えずスタックに入り、左に遍歴する.左に行けない場合は、スタックを返して右に行きます.
void PreOrderTraverse(BiTree T)/非再帰先順遍歴{
stack Stack;
if(!T)
{
printf(「空の木!」
return;
}
while(T || !Stack.empty())
{
while(T)
{
Stack.push(T);
printf("%c",T->data);
T=T->lchild;
}
T=Stack.top();
Stack.pop();
T=T->rchild;
}
}
後序遍歴非再帰実装:ルートノードがスタックに入り、左に遍歴する.左は遍歴できない:ロールバック、右:右は遍歴できない、ロールバック、出力、ロールバック右;+1つの検証にアクセスしたかどうか
void PostOrderTraverse(BiTree T)/非再帰先順遍歴{
stack Stack;
if(!T)
{
printf(「空の木!」
return;
}
while(T || !Stack.empty())
{
while(T&&NOTACC(T))
{
Stack.push(T);
T=T->lchild;
}
T=Stack.top();//バックスタックバックスタック while(T&&NOTACC(T))
{
Stack.push(T);
T=T->rchild;
}
T=Stack.top();
printf("%c",T->data);
Stack.pop();
T=Stack.top();
T=T->rchild;
}
}
(3)階層遍歴:キュー
void PostOrderTraverse(BiTree T)/非再帰先順遍歴{
stack Stack;
if(!T)
{
printf(「空の木!」
return;
}
if(T!=null)
{
push(T);
while(q&&front!=rear){
q=pop(front);
visit(q);
if(q->lchild) push(q->lchild);
if(q->rchild) push(q->rchild);
}
}
}
void pre(BtNode * p){// :
if(p!=NULL){
visit(p);
pre(P->Lchild);
pre(P->Rchild);
}
}
注意:結合中先、中後、中層はいずれも二叉木の構造を確定することができる.
(2)「先、中、後」遍歴アルゴリズムの非再帰的な書き方:スタック--左圧スタック、退スタック右
先:左側は絶えずスタックを葉まで押して、空いたらスタックを返して右に行って、左側は絶えずスタックを押します.スタック時出力
日:左側は絶えず葉までスタックを押して、空いていたら右にスタックを返して、左側は絶えずスタックを押します.バックスタック時出力
後:左側は葉までスタックを押し続け、空またはスタックにアクセスし、右側は葉までスタックを押し続け、空またはスタックにアクセスし、スタックを右に返します.セカンドスタック時出力
中序遍歴非再帰実装:ルートノードはスタックに切断され、左に遍歴する.左にできない場合は、スタックを返し、出力し、右に遍歴します.
void InOrderTraverse(BiTree T)/非再帰中序遍歴{
stack
if(!T)
{
printf(「空の木!」
return;
}
while(T || !Stack.empty())
{
while(T)
{
Stack.push(T);
T=T->lchild;
}
T=Stack.top();
Stack.pop();
printf("%c",T->data);
T=T->rchild;
}
}
先序遍歴非再帰実現:出力、ノードと絶えずスタックに入り、左に遍歴する.左に行けない場合は、スタックを返して右に行きます.
void PreOrderTraverse(BiTree T)/非再帰先順遍歴{
stack
if(!T)
{
printf(「空の木!」
return;
}
while(T || !Stack.empty())
{
while(T)
{
Stack.push(T);
printf("%c",T->data);
T=T->lchild;
}
T=Stack.top();
Stack.pop();
T=T->rchild;
}
}
後序遍歴非再帰実装:ルートノードがスタックに入り、左に遍歴する.左は遍歴できない:ロールバック、右:右は遍歴できない、ロールバック、出力、ロールバック右;+1つの検証にアクセスしたかどうか
void PostOrderTraverse(BiTree T)/非再帰先順遍歴{
stack
if(!T)
{
printf(「空の木!」
return;
}
while(T || !Stack.empty())
{
while(T&&NOTACC(T))
{
Stack.push(T);
T=T->lchild;
}
T=Stack.top();//バックスタックバックスタック while(T&&NOTACC(T))
{
Stack.push(T);
T=T->rchild;
}
T=Stack.top();
printf("%c",T->data);
Stack.pop();
T=Stack.top();
T=T->rchild;
}
}
(3)階層遍歴:キュー
void PostOrderTraverse(BiTree T)/非再帰先順遍歴{
stack
if(!T)
{
printf(「空の木!」
return;
}
if(T!=null)
{
push(T);
while(q&&front!=rear){
q=pop(front);
visit(q);
if(q->lchild) push(q->lchild);
if(q->rchild) push(q->rchild);
}
}
}