问题描述:
二叉树遍历多是以递归的方式实现,迭代的实现需要借助于辅助的数据结构:栈。
中序的遍历顺序是:左子树,根,右子树。
- 由于需要先访问左子树,所以采用栈对没有访问的元素进行暂时保存。
- 元素从栈中弹出时才进行访问
- 访问完成后将右子树压入栈中
- 栈中的最后一个被访问的元素一定没有右子树。
初始化:
cur = root; stack<TreeNode*> st;
迭代过程:
while (!st.empty() || cur)
{
if (cur)
{ st.push(cur); cur = cur->next; }
else
{ cur = st.pop(); visit(cur); cur = cur->next;}
}
代码示例:
/* 二叉树遍历的中序的迭代版本
* 需要stack 结构, cur变量的帮助
* 每个节点都作为左子树被压入栈,作为根被访问,
* 再转入右子树做重复的处理
*
*/
void in_visit_iterative(node *root)
{
if (!root)
return;
node *cur = root;
stack<node*> s;
/*
* 如何证明该循环不会是一个死循环 ??
* 最后一个被访问的元素肯定没有右子树
**/
while (cur || !s.empty())
{
if (cur)
{
s.push(cur);
cur = cur->l;
}
else
{
cur = s.top();
s.pop();
os << cur->dat << " ";
cur = cur->r;
}
}
}