主要是借助两个辅助栈,一个节点栈和一个 data 栈,data 栈中存放的是每个节点 data 的逆序。
考虑后序遍历固定是根节点最后访问,如果我们逆序一下,则根节点可以最先访问,首先确定下来。
即先得到一个逆序版的后序遍历,再通过一个栈的倒腾还原。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
template <class T, class VST>
void travPost_I(BinNodePosi(T) x, VST& visit) {
if (NULL == x) return;
Stack<BinNodePosi(T)> S1;
S1.push(x);
Stack<int> S2;
while (!S1.empty()) {
x = S1.pop();
if (x->lchild != NULL) S1.push(x->lchild);
if (x->rchild != NULL) S1.push(x->rchild);
S2.push(x->data);
}
while (!S2.empty())
visit(S2.pop());
}
|
需要注意的是,在往节点栈中 push 孩子节点的时候,先被 push 的是左孩子,因为我们需要的是一个逆序版的后序遍历。
这种方法空间复杂度和时间复杂度都会多出一个O(n),但对比查找最高左侧可见叶节点的方法,实现起来要简单很多。