二叉树的深度优先遍历(栈)和广度优先遍历(队列)
2016-10-14 11:17
2707 查看
前序,中序和后序遍历都是深度优先遍历的特例
:所以直接先序中序后续遍历也可以
深度优先遍历(栈,先压右节点,再压左节点)
也就深入的遍历,沿着每一个分支直到走到最后,然后才返回来遍历剩余的节点。二叉树不同于图,图需要标记节点是否已经访问过,因为可能会存在环,而二叉树不会出现环,所以不需要标记。那么,我们只需要一个栈空间,来压栈就好了。因为深度优先遍历,遍历了根节点后,就开始遍历左子树,所以右子树肯定最后遍历。我们利用栈的性质,先将右子树压栈,然后在对左子树压栈。此时,左子树节点是在top上的,所以可以先去遍历左子树。
如下是深度优先遍历的代码:
[cpp] view
plaincopy
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依次读取并删除左右孩子,这样就保证了层次的输出。
下面是二叉树的广度优先遍历代码:
[cpp] view
plaincopy
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);
}
}
}
:所以直接先序中序后续遍历也可以
深度优先遍历(栈,先压右节点,再压左节点)
也就深入的遍历,沿着每一个分支直到走到最后,然后才返回来遍历剩余的节点。二叉树不同于图,图需要标记节点是否已经访问过,因为可能会存在环,而二叉树不会出现环,所以不需要标记。那么,我们只需要一个栈空间,来压栈就好了。因为深度优先遍历,遍历了根节点后,就开始遍历左子树,所以右子树肯定最后遍历。我们利用栈的性质,先将右子树压栈,然后在对左子树压栈。此时,左子树节点是在top上的,所以可以先去遍历左子树。
如下是深度优先遍历的代码:
[cpp] view
plaincopy
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依次读取并删除左右孩子,这样就保证了层次的输出。
下面是二叉树的广度优先遍历代码:
[cpp] view
plaincopy
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);
}
}
}
相关文章推荐
- python 用栈和队列实现二叉树的深度优先遍历(三种)和广度优先遍历
- 二叉树的深度优先遍历(栈)和广度优先遍历(队列)
- 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]
- 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]
- 二叉树深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]
- 二叉树的深度优先遍历和广度优先遍历
- 转:二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历与广度优先遍历
- 二叉树的广度优先遍历和深度优先遍历
- 二叉树深度优先遍历和广度优先遍历
- PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历、广度优先遍历和非递归遍历
- [zz]二叉树的深度优先遍历、广度优先遍历和非递归遍历
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- java实现二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]