先序遍歷、中序遍歷、後序遍歷和斐波那契數列計算的非遞歸實現

斐波那契數列計算(非遞歸方法)

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);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章