您的位置:首页 > 理论基础 > 数据结构算法

数据结构:二叉树前序、中序和后序遍历的非递归表示

2018-02-25 10:16 351 查看

二叉树遍历方法

对于递归形式的前序、中序和后序遍历,这里就不说了,这里主要是介绍非递归形式的做法,对于二叉树的BFS层次遍历这里就不介绍了,直接使用队列做即可。

前序遍历

前序遍历的非递归形式很简单,直接按照stack的方式存储相关节点遍历即可。

伪代码如下:

使用stack做遍历,
curr = root
while(true)
{
while(curr!=null)
{
cout<<curr->value<<endl;
stack.push(curr);
curr = curr->left;
}

if(stack.empty())
break;
else
{
top = stack.top();
stack.pop();
curr = top->right;
}
}


中序遍历

伪代码如下:

使用stack做遍历,
curr = root
while(true)
{
while(curr!=null)
{
stack.push(curr);
curr = curr->left;
}

if(stack.empty())
break;
else
{
top = stack.top();
cout<<top->value<<endl;
stack.pop();
curr = top->right;
}
}


后序遍历

要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存 在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了 每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。

stack;
BinTree *cur = root;                      //当前结点
BinTree *pre = NULL;                 //前一次访问的结点
stack.push(root);
while(!s.empty())
{
cur = s.top();
if((cur->left==NULL&&cur->right==NULL)||
(pre!=NULL&&(pre==cur->left||pre==cur->right)))
{
cout<<cur->data<<" ";  //如果当前结点没有孩子结点或者孩子节点都已被访问过
s.pop();
pre=cur;
}
else
{
if(cur->right!=NULL)
s.push(cur->right);
if(cur->left!=NULL)
s.push(cur->left);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐