二叉树的遍历和线索二叉树

二叉树的遍历和线索二叉树

递归遍历

先序遍历

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算法

相关文章
相关标签/搜索