本文参考清华邓公课程内容。
先序遍历
先来看递归法:
//先序遍历递归实现算法
template <typename T,typename VST>//元素类型、操作器
void traverse(BinNodePosi(T) x,VST & visit){
if(!x) return;
visit(x->data);//访问当前节点
traverse(x->lchild,visit);//递归访问左子树
traverse(x->rchild,visit);
}//T(n)=O(1)+T(a)+T(n-a-1)=O(n)
第一种迭代思路:
//二叉树先序遍历算法(迭代版#1)
template <typename T, typename VST> //元素类型、操作器
void travPre_I1 ( BinNodePosi(T) x, VST& visit ) {
Stack<BinNodePosi(T)> S; //辅助栈
if ( x ) S.push ( x ); //根节点入栈
while ( !S.empty() ) { //在栈变空之前反复循环
x = S.pop(); visit ( x->data ); //弹出并访问当前节点,其非空孩子的入栈次序为先右后左
if ( HasRChild ( *x ) ) S.push ( x->rc );
if ( HasLChild ( *x ) ) S.push ( x->lc );
}
}