在网上看了很多二叉树前序遍历非递归实现,有的很巧。但是我想能不能就是用最原始的办法,通过栈了模拟递归函数的调用来实现。最后费了好大劲实现了。
要点是要用两个栈来模拟递归:
第一个栈s记录当下的节点;
第二个栈sp记录当下的返回点,也就是在递归函数中是返回到了左节点遍历完,还是右节点遍历完。
// BTree.h
template <class T>
class BTree {
template <class T1> friend void visit (BTree<T1> *);
template <class T1> friend void pre_order_r(BTree<T1> *);
template <class T1> friend void pre_order_n(BTree<T1> *);
public:
BTree(const T& e, BTree<T> *l, BTree<T> *r){
data = e;
left = l;
right = r;
}
private:
T data;
BTree<T> *left, *right;
};
template <class T>
void