数据结构之二叉树

来源:互联网 发布:淘宝发货快递公司填错 编辑:程序博客网 时间:2024/06/05 16:14

一、二叉树的递归实现

1.先序遍历(DLR


先序遍历的递归过程为:若二叉树为空,遍历结束。否则,
(1) 访问根结点;
(2) 先序遍历根结点的左子树;
(3) 先序遍历根结点的右子树。

先序遍历二叉树的递归算法如下:

void PreOrder(BiTree bt) /*先序遍历二叉树bt*/
{
      if (bt==NULL) return; /*递归调用的结束条件*/
      Visite(bt->data);     /*访问结点的数据域*/
      PreOrder(bt->lchild); /*先序递归遍历bt 的左子树*/
      PreOrder(bt->rchild); /*先序递归遍历bt 的右子树*/
}


2.中序遍历(LDR)

中序遍历的递归过程为:若二叉树为空,遍历结束。否则,
(1)中序遍历根结点的左子树;
(2)访问根结点;
(3)中序遍历根结点的右子树。

中序遍历二叉树的递归算法如下:

void InOrder(BiTree bt) /*中序遍历二叉树bt*/
{
     if (bt==NULL) return; /*递归调用的结束条件*/
     InOrder(bt->lchild); /*中序递归遍历bt 的左子树*/
     Visite(bt->data);     /*访问结点的数据域*/
     InOrder(bt->rchild); /*中序递归遍历bt 的右子树*/
}


3.后序遍历(LRD)


后序遍历的递归过程为:若二叉树为空,遍历结束。否则,
(1)后序遍历根结点的左子树;
(2)后序遍历根结点的右子树。
(3)访问根结点;

后序遍历二叉树的递归算法如下:

void PostOrder(BiTree bt) /*后序遍历二叉树bt*/
{
     if (bt==NULL) return; /*递归调用的结束条件*/
     PostOrder(bt->lchild); /*后序递归遍历bt 的左子树*/
     PostOrder(bt->rchild); /*后序递归遍历bt 的右子树*/
     Visite(bt->data); /*访问结点的数据域*/
}


4.层次遍历

所谓二叉树的层次遍历,是指从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。

下面讨论层次遍历的算法。

由层次遍历的定义可以推知,在进行层次遍历时,对一层结点访问完后,再按照它们的访问次序对各个结点的左孩子和右孩子顺序访问,这样一层一层进行,先遇到的结点先访问,这与队列的操作原则比较吻合。因此,在进行层次遍历时,可设置一个队列结构,遍历从二叉树的根结点开始,首先将根结点指针入队列,然后从对头取出一个元素,每取一个元素,执行下面两个操作:

(1) 访问该元素所指结点;
(2) 若该元素所指结点的左、右孩子结点非空,则将该元素所指结点的左孩子指针和右孩子指针顺序入队。

此过程不断进行,当队列为空时,二叉树的层次遍历结束。

在下面的层次遍历算法中,二叉树以二叉链表存放,一维数组Queue[MAXNODE]用以实现队列,变量front 和rear 分别表示当前对首元素和队尾元素在数组中的位置。


void LevelOrder(BiTree bt) /*层次遍历二叉树bt*/

    BiTree Queue[MAXNODE];
    int front,rear;

    if (bt==NULL) 
        return;

    front=-1;
    rear=0;
    queue[rear]=bt;

    while(front!=rear)
    {
        front++;
        Visite(queue[front]->data); /*访问队首结点的数据域*/

        if (queue[front]->lchild!=NULL) /*将队首结点的左孩子结点入队列*/
        { 
            rear++;
            queue[rear]=queue[front]->lchild;
        }

        if (queue[front]->rchild!=NULL) /*将队首结点的右孩子结点入队列*/
        { 
            rear++;
            queue[rear]=queue[front]->rchild;
        }
    }

}


1 0
原创粉丝点击