二叉树遍历的递归实现(先序中序后序和层次遍历)

Posted kangna

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树遍历的递归实现(先序中序后序和层次遍历)相关的知识,希望对你有一定的参考价值。

由二叉树的定义可知,一棵二叉树由根结点、左子树和右子树三部分组成。因此,只要遍历了这三个部分,就可以实现遍历整个二叉树。若以D、L、R分别表示遍历根结点、左子树、右子树,则二叉树的递归遍历可以有一下三种方式:

先序遍历(DLR)

先序遍历的递归过程为

(1)访问根结点
(2)先序遍历根结点的左子树
(3)先序遍历根结点的右子树

举例:
技术图片
代码:

void PreOrder(BiTree bt)
{
    if(bt ==NULL)return;    //递归的结束条件----某结点为空时
    printf("bt->data);      //这里用printf data表示访问结点的数据域
    PreOrder(bt->lchild);   //递归遍历左孩子
    PreOrder(bt->rclild);   //递归遍历右孩子
}

中序遍历(LDR

(1)中序遍历根结点的左子树
(2)访问根结点
(3)中序遍历根结点的右子树

举例:
技术图片
代码:

void PreOrder(BiTree bt)
{
    if(bt ==NULL)return;    //递归的结束条件----某结点为空时
    PreOrder(bt->lchild);   //递归遍历左孩子
    printf("bt->data);      //这里用printf data表示访问结点的数据域
    PreOrder(bt->rclild);   //递归遍历右孩子
}

后序遍历(LRD)

(1)后序遍历二叉树的左子树
(2)后序遍历二叉树的右子树
(3)访问根结点。

举例:
技术图片
代码:

void PreOrder(BiTree bt)
{
    if(bt ==NULL)return;    //递归的结束条件----某结点为空时
    PreOrder(bt->lchild);   //递归遍历左孩子
    PreOrder(bt->rclild);   //递归遍历右孩子
    printf("bt->data);      //这里用printf data表示访问结点的数据域
}     

层次遍历

(1)根结点入栈
(2)根结点出栈,根结点的左子树、右子树相继入栈
(3)根结点的左子树结点出栈,左子树结点的左子树、右子树相继入栈
(4).......

举例:
技术图片
代码:

//层次遍历二叉树
void LevelOrder(BiTree T)
{
    BiTree Queue[MAX],b;        //用一维数组表示队列,front和rear表示队首和队尾的指针
    int front,rear;
    front=rear=0;
    if(T)
    //若树为空    
    {
        Queue[rear++]=T;    //根节点入队列
        while(front!=rear)  //当队列非空
        {
            b=Queue[front++];     //队首元素出队列,并访问这个节点 
            printf("%2c",b->data);
            if(b->lchild!=NULL) Queue[rear++]=b->lchild ;  //若左子树非空,则入队列
            if(b->rchild!=NULL) Queue[rear++]=b->rchild ;  //若右子树非空,则入队列 
        } 
    }   
} 

最终代码:

#include<stdio.h>
#include<stdlib.h>
#define MAX 20
typedef char TElemType;
typedef int Status;
typedef struct BiTNode
{
    TElemType data;   
    struct BiTNode *lchild,*rchild; //左右孩子的指针 
} BiTNode,*BiTree;
//先序创建二叉树
void CreateBiTree(BiTree *T)
{
    char ch;
    ch=getchar();
    if(ch=='#')(*T)=NULL;   //#代表空指针
    else
    {
        (*T)=(BiTree)malloc(sizeof(BiTNode));  //申请节点
        (*T)->data=ch;      //生成跟节点
        CreateBiTree(&(*T)->lchild);
        CreateBiTree(&(*T)->rchild);
    }   
} 
//先序输出二叉树
void PreOrder(BiTree T)
{
    if(T)
    {
        printf("%2c",T->data);   //访问根节点,此处为输出根节点的数据值   
        PreOrder(T->lchild);     //先序遍历左子树
        PreOrder(T->rchild);     //先序遍历右子树
    } 
} 
//中序输出二叉树
void InOrder(BiTree T)
{
if(T)
    {
        PreOrder(T->lchild);
        printf("%2c",T->data);
        PreOrder(T->rchild);
    }   
} 
//后序输出二叉树
void PostOrder(BiTree T)
{
if(T)
    {
        PreOrder(T->lchild);
        PreOrder(T->rchild);
        printf("%2c",T->data);
    }   
} 
//层次遍历二叉树
void LevelOrder(BiTree T)
{
    BiTree Queue[MAX],b;        //用一维数组表示队列,front和rear表示队首和队尾的指针
    int front,rear;
    front=rear=0;
    if(T)
    //若树为空    
    {
        Queue[rear++]=T;    //根节点入队列
        while(front!=rear)  //当队列非空
        {
            b=Queue[front++];     //队首元素出队列,并访问这个节点 
            printf("%2c",b->data);
            if(b->lchild!=NULL) Queue[rear++]=b->lchild ;  //若左子树非空,则入队列
            if(b->rchild!=NULL) Queue[rear++]=b->rchild ;  //若右子树非空,则入队列 
        } 
    }   
} 
//求树的深度
int depth(BiTree T)
{
    int dep1,dep2;
    if(T==NULL) return 0;
    else
    {
        dep1=depth(T->lchild);
        dep2=depth(T->rchild);
        return dep1>dep2?dep1+1:dep2+1; 
    }   
} 
int main()
{
    BiTree T=NULL;
    printf("
 创建一棵二叉树: 
");
    CreateBiTree(&T);  //创建二叉树
    printf("
先序遍历的结果为:
");
    PreOrder(T);  //先序遍历
    printf("
中序遍历的结果为:
");
    InOrder(T);  //中序遍历 
    printf("
 后序遍历的结果为: 
");
    PostOrder(T); 
    printf("
 层次遍历的结果为: 
");
    LevelOrder(T); //层次遍历
    printf("
 树的深度为:%d
",depth(T)); 
}

结果示例:
技术图片

啊,你们不会又打算白嫖吧,点赞呢,关注呢?
技术图片

以上是关于二叉树遍历的递归实现(先序中序后序和层次遍历)的主要内容,如果未能解决你的问题,请参考以下文章

前序+中序 = 二叉树(先序中序后序层次遍历)

二叉树遍历(先序中序后序)

用递归算法先序中序后序遍历二叉树

二叉树遍历的三种方法:先序遍历,中序遍历,后序遍历

二叉树问题:递归方式实现二叉树先序中序后序遍历

二叉树先序中序后序遍历 递归与非递归 Python实现