斐波那契數列計算(非遞歸方法)
tag=1代表還未計算,tag=2代表已計算,計算fib(5),則需要先計算出fib(2)、fib(3)和fib(4),因此先進行入棧,sum計算這些數值;當這個棧不爲空,即fib(5)未被計算,彈出棧,先計算fib(2),fib(2)tag=1,還未被計算,因此,n=n-2(代表fib(0)),sum此時已計算fib(1),因此fib(2)=sum+fib(0),其他同理彈出,直至計算出fib(5)
int fib(int n){
BiTNode *w;
SqStack st;
int sum=0;
InitStack(st);
do{
while(n>1){
w=(BiTNode*)malloc(sizeof(BiTNode));
w->data=n;
w->tag=1;
Push(st,w);
n--;
}
sum=sum+n;
while(!StackEmpty(st)){
Pop(st,w);
if(w->tag==1){
n=w->data-2;
w->tag=2;
Push(st,w);
break;
}
}
}while(!StackEmpty(st));
return sum;
}
//
先序遍歷非遞歸實現
/*先序遍歷*/
void PreOrder(BiTree T){
if(T!=NULL){
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
/*先序遍歷非遞歸實現*/
void PreOrder2(BiTree T){
SqStack st;
InitStack(st);
BiTree p=T;
while(p||!StackEmpty(st)){
if(p){
visit(p);
Push(st,p);
p=p->lchild;}
else{
Pop(st,p);
p=p->rchild;
}
}
}
//
中序遍歷非遞歸實現
/*中序遍歷*/
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
}
/*中序遍歷非遞歸實現*/
void InOrder2(BiTree T){
SqStack st;
InitStack(st);
BiTree p=T;
while(p||!StackEmpty(st)){
if(p){
Push(st,p);
p=p->lchild;
}else{
Pop(st,p);
visit(p);
p=p->rchild;
}
}
}
//
後序遍歷非遞歸實現
後序遍歷需要用到兩個棧,多了一個用於輸出的棧,先進行掃描右子樹,並將訪問的結點一一入棧(兩個棧都需要push),直到結點沒有右結點,開始對普通棧進行彈出操作,訪問其左子結點,若左子節點爲空則繼續彈出,直至有不爲空的左子節點,然後入棧(兩個棧都需要push),等掃描結束後,利用輸出棧進行出棧並一一訪問
/*後序遍歷*/
void PostOrder(BiTree T){
if(T!=NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
}
}
/*後序遍歷非遞歸實現*/
void PostOrder2(BiTree T){
SqStack st;
InitStack(st);
SqStack out;
InitStack(out);
BiTree p=T;
while(p||!StackEmpty(st)){
if(p){
Push(st,p);
Push(out,p);
p=p->rchild;
}else{
Pop(st,p);
p=p->lchild;
}
}
while(!StackEmpty(out)){
Pop(out,p);
visit(p);
}
}