一、遍历
按照某种特定的次序,访问树中各个节点,且每个节点恰好被访问一次的操作成为遍历。在二叉树这种半线性结构中,如何合理对其节点遍历是我们需要认真学习的地方。
根据遍历顺序,有多种遍历策略。以节点本身被访问的次序分类,可分为先序(VLR)、中序(LVR)、后序(LRV)三种方式。
二、先序遍历
1.递归式
最通俗易懂的表达方式为递归式,及查看完节点本身后依次对左右子节点递归调用自己,代码如下:
template <typename T, typename VST>
void traverse( BinModePosi(T) x, VST & visit)
{
if(!x)
return;
visit(x -> data);
traverse(x -> lchild, visit);
traverse(x -> rchild, visit);
}
递归式虽通俗易懂,但调用时运算量较大,处理教复杂数时并不方便,因此可以改进为迭代形式。
2.迭代式(1)
该形式代码利用栈结构,每次取出栈顶节点,提取本身元素后先后将右子、左子放回栈中,再进行后续操作。
template <typename T, typename VST>
void travPre_I1(BinNodePosi(T) x, VST & visit)
{
Stack <BinNodePosi(T)> s;
if(x) s.push(x); //放入根节点
while (