二叉树的非递归遍历以及层次遍历

在递归调用过程用,每次调用函数都要把当前的局部变量压栈。所有递归函数,使用栈都可以写成非递归调用。

上篇“二叉树的递归遍历”使用栈即可写成非递归遍历。

//先序遍历 
void BinTree::preoeder(Node *r,void (*visit)(int data))
{
	stack<Node*> S;
	Node *current=r;
	while(current!=NULL||S.empty()==false)
	{
		while(current!=NULL)
		{
			visit(current->data);
			S.push(current);
			current=current->left;
		}
		
		current=S.top();
		S.pop();
		current=current->right;
		
	}
}
//中序遍历 
void BinTree::inorder(Node *r,void (*visit)(int data))
{
	stack<Node*> S;
	Node *current=r;
	while(current!=NULL||S.empty()==false)
	{
		while(current!=NULL)
		{
			S.push(current);
			current=current->left;
		}
		current=S.top();
		S.pop();
		visit(current->data);
		current=current->right;
	}
}
//后序遍历 
void BinTree::postoeder(Node *r,void(*visit)(int data))
{
	stack<Node*> S;
	Node *current=r;
	Node *last=NULL;//记录上次遍历的结点
	while(current!=NULL||S.empty()==false)
	{
		while(current!=NULL)
		{
			S.push(current);
			current=current->left;
		}
		current=S.top();
		if(current->right==NULL||current->right==last)//无右孩子或右孩子已经访问过,那么可以访问此节点 
		{
			visit(current->data);
			last=current;
			S.pop();
			current=NULL;
		} 
		else
		current=current->right;
		
	}
}
层次遍历要使用队列,按照层次一次入队出队来遍历。
//层次遍历
void BinTree::levelorder(Node *r,void (*visit)(int data))
{
	queue<Node*> Q;
	Q.push(r);
	while(!Q.empty())
	{
		Node *current=Q.front();
		Q.pop();
		visit(current->data);
		if(current->left!=NULL)
		Q.push(current->left);
		if(current->right)
		Q.push(current->right);
	}
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值