二叉樹遍歷模板


以下是複習默寫記錄的模板,爲以後回顧模板方便

結構化定義

typedef struct node{
	elemType data;  //數據域 
	struct node *lchild, *rchild;  //左右孩子指針 
}Btree;

遞歸遍歷

遞歸先序遍歷

//遞歸先序遍歷
void PreOrder(Btree T){
	visit(T);
	preOrder(T->lchild);
	preOrder(T->rchild);
}

遞歸中序遍歷

//遞歸中序遍歷
void InOrder(Btree T){
	InOrder(T->lchild);
	visit(T);
	InOrder(T->rchild);
}

遞歸後序遍歷

//遞歸後序遍歷
void PostOrder(Btree T){
	PostOrder(T->lchild);
	PostOrder(T->rchild);
	visit(T);
} 

非遞歸遍歷

非遞歸先序遍歷

//非遞歸先序遍歷
void PreOrder(Btree T){
	InitStack(S); Btree p = T;
	while(p || !IsEmpty(S)){
		if(p){
			visit(p);
			push(S, p);
			p = p->lchild;
		}
		else{
			pop(S,p);
			p = p->rchild;
		}
	}
} 

非遞歸中序遍歷

// 非遞歸中序遍歷
void InOrder(Btree T){
	InitStack(S); Btree p = T;
	while(p || !IsEmpty(S)){
		if(p){
			push(S, p);
			p = p->lchild;
		}
		else {
			pop(S, p);
			visit(p);
			p = p->rchild;
		}
	}
} 

非遞歸後序遍歷

// 非遞歸後續遍歷
void PostOrder(Btree T){
	InitStack(S);  Btree p = T, b = NULL;
	
	while(p || !IsEmpty(S)){
		if(p){
			Push(S, p);
			p = p->lchild;
		} 
		else {
			GetTop(S, p);
			if(p->rchild && p->rchild!=r){
				p = p->rchild;
				Push(S, p);
				p = p->lchild;
			}
			else{
				Pop(S, p);
				visit(p);
				b = p;
				p = NULL;
			}
		}
	}
} 

層次遍歷

//層次遍歷
void levelOrder(Btree T){
	InitQueue(Q);
	Btree p;
	EnQueue(Q, T);
	while(!IsEmpty(Q)){
		DeQueue(Q, p);
		visit(p);
		if(p->lchild != null){
			EnQueue(Q, p->lchild);
		}
		if(p->rchild != null){
			EnQueue(Q, p->rchild);
		}
	}
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章