数据结构-二叉树的特殊遍历方式

172 阅读2分钟

非递归方式遍历二叉树

虽然二叉树是以递归方式建立的,但是我们仍然可以不使用递归的方式来实现二叉树的元素遍历。在学习栈时,我们知道了栈是一种先入后出的数据结构。它可以实现遍历元素的倒序输出。同样的,在二叉树中,我们仍然可以使用栈这种结构,来实现二叉树遍历的非递归算法。

这里以先序遍历为例,我们首先创建一个栈st,并创建一个二叉树遍历指针s。当st不空或者s不指向空时循环:如果s不指向空,那么就先访问s指向的数据元素,并将s指向的结点push到st中,之后让s指向s的左孩子结点;如果s指向空,那么pop栈顶结点,让s指向s的右孩子结点。当循环结束时,代表二叉树中所有的结点遍历完成,且遍历方式为先序遍历。C++代码实现如下:

//非递归先序遍历二叉树
void preOrder (node_bit t) {
    new_stack(st);
    node_bit s=t;
    while(s||!isEmpty(st)){
        if(s){
            getx(s);
            push(st,s);
            p=p->lchild;
        }else{
            pop(st,s);
            p=p->rchild;
        }
    }
}

如果是中序遍历,方法和先序遍历基本一致,只需要做出一点点微小的改动。中序遍历下,访问s指向的结点的数据元素应当在st栈顶元素出栈后再访问,而不是最先访问。代码改动如下:

//非递归中序遍历二叉树
void midOrder (node_bit t) {
    new_stack(st);
    node_bit s=t;
    while(s||!isEmpty(st)){
        if(s){
            push(st,s);
            p=p->lchild;
        }else{
            pop(st,s);
            getx(s);
            p=p->rchild;
        }
    }
}

后续遍历的非递归实现比较困难,这里先不做讨论。

层序遍历二叉树

除了先序、中序和后续遍历方式外,我们还可以根据二叉树的层次来遍历二叉树当中的各个结点元素,这种遍历我们将它叫做层序遍历(也叫层次遍历)。在层序遍历中,对于同一层次的结点数据元素,我们从左到右依次遍历各个结点。

我们可以借助队列来实现二叉树的层序遍历:首先创建一个队列qu,将二叉树的根结点进入到队列,当qu不为空时循环:qu出列一次并访问刚才出列的数据元素,如果该结点左孩子不为空,就将左孩子结点加入到队列中;如果右孩子不为空,就将右孩子结点加入到队列中。直到队列qu为空时退出循环,这样该二叉树层序遍历完成。C++代码实现如下:

//层序遍历二叉树
void levelOrder (node_bit t) {
    new_queue(qu);
    node_bit s;
    enQueue(qu,t);
    while(!isEmpty(qu)){
        deQueue(qu,s);
        getx(s);
        if(p->lchild!=NULL)
            enQueue(qu,p->lchild);
        if(p->rchild!=NULL)
            enQueue(qu,p->rchild);
    }
}