在二叉树的后序遍历的非递归算法(一)中使用的是一个堆栈,且加了一个额外的信息来说明右孩子是否已经访问
下面是使用两个堆栈来实现后序遍历的非递归算法,理解起来比第一个算法要好理解:
///
以下内容引用:http://blog.csdn.net/ssjhust123/article/details/7773103
///
后序遍历的非递归算法较复杂,使用一个栈可以实现,但是过程很繁琐,这里可以巧妙的用两个栈来实现后序遍历的非递归算法。注意到后序遍历可以看作是下面遍历的逆过程:即先遍历某个结点,然后遍历其右孩子,然后遍历其左孩子。这个过程逆过来就是后序遍历。算法步骤如下:
- Push根结点到第一个栈s中。
- 从第一个栈s中Pop出一个结点,并将其Push到第二个栈output中。
- 然后Push结点的左孩子和右孩子到第一个栈s中。
- 重复过程2和3直到栈s为空。
- 完成后,所有结点已经Push到栈output中,且按照后序遍历的顺序存放,直接全部Pop出来即是二叉树后序遍历结果。
- void postOrderIter(struct node *root)
- {
- if (!root) return;
- stack<struct node*> s, output;
- s.push(root);
- while (!s.empty()) {
- struct node *curr = s.top();
- output.push(curr);
- s.pop();
- if (curr->left)
- s.push(curr->left);
- if (curr->right)
- s.push(curr->right);
- }
- while (!output.empty()) {
- cout << output.top()->data << " ";
- output.pop();
- }
- cout << endl;
- }
///