先序遍历:
递归实现:
#define BinNodePosi(T) BinNode<T>*
template <typename T, typename VST>
void travse(BinNodePosi(T), VST & visit)
{
if(!x) return;
visit(x->data);//访问节点数据
travse(x->lchlid, visit);
travse(x->rchlid, visit);
}//T(n) = O(1) + T(a) + T(n - a - 1) = O(n)
迭代实现:
迭代实现有两个版本,详见下文。
#define BinNodePosi(T) BinNode<T>*
template<typename T, typename VST>
void travPre_I(BinNodePosi(T) x, VST& visit)
{
Stack <BinNodoPosi(T)> s; //辅助栈
if(!x) s.push(x);
while(!s.empty()) //在栈变空之前反复循环
{
x = s.pop(); //弹出
visit(x->data); //访问
if(hasRChlid(*x)) s.push(x->rChild); //右孩子先入后出
if(hasLChlid(*x)) s.push(x->lChild); //左孩子后入先出
}
}
第二个版本