递归式遍历
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); //右孩子入队
}
}
*补充
完全二叉树
满二叉树