树的遍历算法

深度优先

非递归版本(借助栈实现)

前序遍历
void DFS(Tree* pRoot )
{
	if( pRoot == nullptr )
		return;
	stack<Tree*> nodes;
	Tree* pointer = pRoot;
	nodes.push( pointer );

	while( !node.empty( ) )
	{
		// 遍历根结点
		pointer = nodes.top( );		
		nodes.pop( );
		cout << pointer->val;

		// 遍历右子树 因为是栈,所以先将右子树结点存入,那么就后访问它
		if( pointer->right )		
			nodes.push( pointer->right );

		// 遍历左子树
		if( pointer->left )			
			nodes.push( pointer->left );
	}
	return;
}

中序遍历
void DFS(Tree* pRoot )
{
	if( pRoot == nullptr )
		return;
	stack<Tree*> nodes;
	Tree* pointer = pRoot;
	while( !node.empty( ) || pointer )
	{
		while( pointer )			// 遍历左子树
		{
			nodes.push( pointer );
			poiniter = pointer->left;
		}

		pointer = nodes.top( );		// 遍历根结点
		nodes.pop( );
		cout << pointer->val;

		pointer = pointer->right;	// 遍历右子树

	}
	return;
}

后序遍历
void DFS(Tree* pRoot )
{
	if( pRoot == nullptr )
		return;
	stack<Tree*> nodes;
	Tree* pointer = pRoot;
	Tree* right_pointer = nullptr;

	while( !node.empty( ) || temp_ptr )
	{
		// 一直走到左下角
		while( pointer )
		{
			nodes.push( pointer );
			pointer = pointer->left;
		}
		pointer = nodes.top( );

		// 右子树为空或者已访问,输出当前节点
		if( pointer->right == nullptr || pointer->right == right_pointer )
		{
			cout << pointer->val;

			// 将当前结点地址赋值right_pointer作为下一次判断标志,防止重复访问
			right_pointer = pointer;
			nodes.pop( );

			//p赋值空以便访问右子树
			pointer = nullptr;
		}
		else    //访问右子树 
		{
			pointer = pointer->right;
		}
	}
	return;
}

递归版本

// 前序遍历
void dfsPreOrder( Tree* pRoot )
{
	if( pRoot == nullptr )
		return;
	Tree* pointer = pRoot;

	cout << pointer->val;

	if( pointer->left )
		dfsPreOrder( pointer->left );
	
	if( pointer->right )
		dfsPreOrder( pointer->right );
	
	return;
}


// 中序遍历
void dfsMidOrder( Tree* pRoot )
{
	if( pRoot == nullptr )
		return;
	Tree* pointer = pRoot;

	if( pointer->left )
		dfsMidOrder( pointer->left );
	
	cout << pointer->val;
	
	if( pointer->right )
		dfsMidOrder( pointer->right );
	
	return;
}

// 后序遍历
void dfsLastOrder( Tree* pRoot )
{
	if( pRoot == nullptr )
		return;
	Tree* pointer = pRoot;

	if( pointer->left )
		dfsLastOrder( pointer->left );

	if( pointer->right )
		dfsLastOrder( pointer->right );

	cout << pointer->val;

	return;
}

广度优先借助队列实现
void BFS( TreeNode* pRoot )
{
	queue<TreeNode*> nodeQueue;
	TreeNode* pointer = pRoot;
	if( pointer == nullptr )
		return;

	nodeQueue.push( pointer );
	
	while( !nodeQueue.empty( ) )
	{
		pointer = nodeQueue.front( );
		nodeQueue.pop( );
		cout << pointer->val;
		if( pointer->left )
			nodeQueue.push( pointer->left );
		if( pointer->right )
			nodeQueue.push( pointer->right );
	}
	return;
}


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值