二叉樹的遍歷和線索二叉樹

二叉樹的遍歷和線索二叉樹

遞歸遍歷

先序遍歷

void PreOrder(BiTree T){
	if(T != NULL){
		visit(T);
		PreOrder(T->lchild);
		PreOrder(T-rchild);
	}
}

中序遍歷

void InOrder(BiTree T){
	if(T != NULL){
		InOrder(T->lchild);
		visit(T);
		InOrder(T->rchild);
	}
}

後序遍歷

void PostOrder(BiTree T){
	if(T != NULL){
	PostOrder(T->lchild);
	PostOrder(T->rchild);
	visit(T);
	}
}

非遞歸遍歷

先序遍歷非遞歸算法

void PreOrderTraverse(BiTree T){
	InitStack(S);
	BiTree p=T;
		while(p||!IsEmpty(S)){           //棧不空或p不空時循環
		if(p){
			visit(p);
			Push(S,p);
			p=p->lchild;
		}
		else{
			Pop(S,p);
			p=p->rchild;
		}
	}
}

中序遍歷非遞歸算法

void InOrderTraverse(BiTree T){
	InitStack(S);
	BiTree p=T;
	while(p||!IsEmpty(S)){
		if(p){
			Push(S,p);
			p=p->lchild;
		}
		else{
			Pop(S,p);
			visit(p);
			p=p->rchild;
		}
	}
}

後序遍歷非遞歸算法

後序非遞歸遍歷二叉樹的順序是先訪問左子樹,再訪問右子樹,最後訪問根結點。 當用堆棧來存儲結點時,必須分清楚返回根結點時是從左子樹返回仍是從右子樹返回的。 因此,使用輔助指針r,其指向最近訪問過的結點。也可在結點中增長一個標誌域,記錄是否已被訪問。html

void PostOrder(BiTree T){
	InitStack(S);
	p=T;
	r=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->data);
				r=p;
				p=NULL;                     //使p爲空,從而繼續訪問棧頂
			}
		}
	}
}

原文出處:https://www.cnblogs.com/lingyefengzi/p/11509417.html算法

相關文章
相關標籤/搜索