数据结构(四)之非递归遍历二叉树

void Inoder(Bitree root)//二叉树的中序遍历非递归 
{
	IniStack(&S);//初始化一个栈
	p=root;
	while(!isEmpty(S)||p!=NULL)
	{
		if(p!=NULL)//如果当前结点不为空进栈 
		{
			push(S,p);
			p=p->left;//若该节点的左节点不为空,继续进栈 
		}
		else//如果当前结点左节点为空出栈访问该节点右子树    或当前右节点为空出栈,此时为栈中保留的是该节点的前驱节点,继续访问右节点  
		{
			pop(S,p);//出栈 
			visit(p);//访问该节点 
			p=p->right; //指向该节点右节点 
		}
	 } 
	
 }  
 void PostOrder(BiTree root)
 {
 	BiTNode *p,*q;
 	Stack S;
 	q=NULL;//q是访问节点的右孩子 
 	p=root;
 	InitStack(&S);
 	while(p!=NULL||isEmpty(S))
 	{
 		if(p!=NULL)
 		{
 			p=p->left;
		 }
		 else
		 {
		 	Gettop(S,p);
			 if(p->right==NULL||p->right==q)
			 {
			 	visit(p);
			 	q=p;
			 	pop(S,p);
			 	p=NULL;
			  } 
			  else p=p->right;
		 	
		 	
		 }
	 }
 	
 }
 //表面上看递归算法好像没有调用栈,实际上递归算法的执行需要反复多次地调用自己,没调用一次,系统内部都有系统运行栈区
 //在支持。需要保留本层参数,临时变量与返回地址等,随着函数递归调用,运行栈继续增长,直到函数执行完才能彻底释放占用的空间。 
 

二叉树中序非递归遍历思路
p=root;
①如果栈不为空或者p不为空一直往左走 p=p->left
②如果p为空 出栈得到p节点,访问p,p=p->right。重复以上步骤
二叉树后序非递归思路
p=root;
①设计一个节点q用来保存访问的上一个节点
②如果栈不为空或者p不为空一直往左走p=p->left;
③如果p为空 取栈顶的值,如果栈顶值的右孩子等于NULL,或q,表明此节点的左右孩子都已访问,把p赋值为NULL继续退栈。如果栈顶的右孩子不等于NULL,或q,继续访问该节点的右孩子。重复以上步骤

猜你喜欢

转载自blog.csdn.net/weixin_43752167/article/details/85613159