二叉树的深度优先遍历和广度优先遍历


前面写了二叉树的前中后序遍历,今天才想起来,原来还有深度优先遍历和广度优先遍历。其实前中后序遍历二叉树就是深度优先遍历的特殊情况。在这里,我只写了从根开始遍历的代码。如果从根开始遍历,那么深度优先遍历就相当于二叉树的前序遍历的结果。

深度优先遍历,也就深入的遍历,沿着每一个分支直到走到最后,然后才返回来遍历剩余的节点。二叉树不同于图,图需要标记节点是否已经访问过,因为可能会存在环,而二叉树不会出现环,所以不需要标记。那么,我们只需要一个栈空间,来压栈就好了。因为深度优先遍历,遍历了根节点后,就开始遍历左子树,所以右子树肯定最后遍历。我们利用栈的性质,先将右子树压栈,然后在对左子树压栈。此时,左子树节点是在top上的,所以可以先去遍历左子树。

如下是深度优先遍历的代码:

void DepthFirstTravel(Tree *root)
{
	stack<Tree *> s;
	s.push(root);
	while(!s.empty())
	{
		root = s.top();
		cout << root->data << " ";
		s.pop();
		if(root->rchild != NULL)
		{
			s.push(root->rchild);
		}
		if(root->lchild != NULL)
		{
			s.push(root->lchild);
		}

	}
}

对于广度优先遍历二叉树,也就是按层次的去遍历。依次遍历根节点,然后是左孩子和右孩子。所以要遍历完当前节点的所有孩子,这样才是层次遍历嘛。此时我们就不能用栈这个数据结构了,因为栈只能在栈顶操作。在这里,我们需要根据左右孩子的顺序来输出,所以就是先进先出的原则,那么我们当然就想到了队列这个数据结构。可以在rear依次插入左右孩子,在front依次读取并删除左右孩子,这样就保证了层次的输出。

下面是二叉树的广度优先遍历代码:

void BreadthFirstTravel(Tree *root)
{
	queue<Tree *> q;
	q.push(root);
	while(!q.empty())
	{
		root = q.front();
		cout << root->data << " ";
		q.pop();
		if(root->lchild != NULL)
		{
			q.push(root->lchild);
		}
		if(root->rchild != NULL)
		{
			q.push(root->rchild);
		}
	}
}

好了,这些看上去挺简单的,但是我想,在我们头脑中越是简单的东西,我们的大脑越是喜欢忽视,所以,有必要写一下加强一下。Ok,That's all!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值