数据结构(C++)——二叉树的遍历:先序,后序,中序,层次遍历

递归式遍历

1.先序遍历

template <typename T, typename VST>     //元素类型、操作器
void travPre_R(BinNodePosi(T) x, VST& visit)   {   //二叉树先序遍历算法
    if (!x) return;
    visit( x->data);
    travPre_R(x->lChild, visit);
    travPre_R(x->rChild, visit);
}

2.后序遍历

template <typename T, typename VST>     //元素类型、操作器
void travPre_R(BinNodePosi(T) x, VST& visit)   {   //二叉树后序遍历算法
    if (!x) return;
    travPre_R(x->lChild, visit);
    travPre_R(x->rChild, visit);
    visit( x->data );
}

3.中序遍历

template <typename T, typename VST>     //元素类型、操作器
void travPre_R(BinNodePosi(T) x, VST& visit)   {   //二叉树中序遍历算法
    if (!x) return;
    travPre_R(x->lChild, visit);
    visit( x->data );
    travPre_R(x->rChild, visit);    
}

层次遍历

在所谓广度优先遍历或层次遍历(level-order traversal)中,确定节点访问次序的原则可概括为“先上后下、先左后右”——先访问树根,再依次是左孩子、右孩子、左孩子的左孩子、左孩子的右孩子、右孩子的左孩子、右孩子的右孩子、...,依此类推。

迭代版层次遍历需要使用与栈对称的队列结构

二叉树层次遍历算法:

template <typename T> template <typename VST> //元素类型、操作器
void BinNode<T>::travLevel(VST& visit) { //二叉树局次遍历算法
    Queue<BinNodePosi(T)> Q; //辅劣队列
    Q.enqueue(this); //根节点入队
    while (!Q.empty()) { //在队列再次发空乀前,反复迭代
        BinNodePosi(T) x = Q.dequeue(); visit(x->data); //叏出队首节点幵讵问乀
        if (HasLChild(*x)) Q.enqueue(x->lChild); //左孩子入队
        if (HasRChild(*x)) Q.enqueue(x->rChild); //右孩子入队
    } 
}

*补充

完全二叉树

满二叉树

猜你喜欢

转载自blog.csdn.net/amoscykl/article/details/81369473