二叉树的遍历

Posted Foreordination

tags:

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

一、二叉树的遍历:

1、前序遍历:根左右

2、中序遍历:左根右

3、后序遍历:左右根

4、层次遍历:一层一层的遍历,类似广度优先

二、二叉树的存储结构

  二叉树以二叉链表结构存储,也就是1个数据域,两个指针域(分别指向左右孩子)

技术分享图片
//二叉树的二叉链表结构定义
typedef char ElemType;
typedef struct BiTNode
{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
View Code

二叉树的建立,先按照前序遍历的方式建立二叉树,当然也可以按照中序遍历或者后序遍历的方式建立二叉树

技术分享图片
//以前序遍历的方式建立二叉树
void CreateBiTree(BiTree *T)
{
    ElemType ch;
    cin>>ch;
    if(ch==#)
    {
        *T=NULL;
    }
    else
    {
        *T=(BiTNode)malloc(sizeof(BiTNode));
        if(!*T)
        {
            exit(OVERFLOW);//分配内存失败退出
        }
        else
        {
            (*T)->data=ch;//生成结点
            CreateBiTree(&(*T)->lchild);//构造左子树
            CreateBiTree(&(*T)->rchild);//构造右子树
        }
    }

}
View Code

递归前序遍历二叉树

技术分享图片
//递归方式前序遍历二叉树
void PreOrderTraverse(BiTree T,int level)
{
    if(T==NULL)
    {
        return;
    }
    else
    {
        Display(T->data);
        Floor(T->data,level);//输出了层数
        PreOrderTraverse(T->lchild,level+1);
        PreOrderTraverse(T->rchild,level+1);
    }
}
View Code

递归中序遍历二叉树

技术分享图片
//递归中序遍历
void InOrderTraverse(BiTree T,int level)
{
    if(T==NULL)
    {
        return;
    }
    else
    {
        InOrderTraverse(T->lchild,level+1);
        Display(T->data);
        Floor(T->data,level);
        InOrderTraverse(T->rchild,level+1);
    }
}
View Code

递归后序遍历二叉树

技术分享图片
//递归后序遍历
void PostOrderTraverse(BiTree T,int level)
{
    if(T==NULL)
    {
        return;
    }
    else
    {
        PostOrderTraverse(T->lchild,level+1);
        PostOrderTraverse(T->rchild,level+1);
        Display(T->data);
        Floor(T->data,level);
    }
}
View Code

完整代码如下:

技术分享图片
#include<iostream>
#include<stdlib.h>
using namespace std;

typedef char ElemType;

//二叉树的二叉链表结构,也就是二叉树的存储结构,1个数据域,2个指针域(分别指向左右子结点)
typedef struct BiTNode
{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//以前序遍历的方式建立二叉树
void CreateBiTree(BiTree *T)
{
    ElemType ch;
    cin>>ch;
    if(ch==#)
    {
        *T=NULL;
    }
    else
    {
        *T=(BiTNode)malloc(sizeof(BiTNode));
        if(!*T)
        {
            exit(OVERFLOW);//分配内存失败退出
        }
        else
        {
            (*T)->data=ch;//生成结点
            CreateBiTree(&(*T)->lchild);//构造左子树
            CreateBiTree(&(*T)->rchild);//构造右子树
        }
    }

}

//将二叉树前序遍历输出
void Display(ElemType ch)
{
    cout<<ch<<" ";
}

//在输出的基础上,输出层数
void Floor(ElemType ch,int level)
{
    cout<<ch<<"在第"<<level<<""<<end;
}

//递归方式前序遍历二叉树
void PreOrderTraverse(BiTree T,int level)
{
    if(T==NULL)
    {
        return;
    }
    else
    {
        Display(T->data);
        Floor(T->data,level);//输出了层数
        PreOrderTraverse(T->lchild,level+1);
        PreOrderTraverse(T->rchild,level+1);
    }
}
//递归中序遍历
void InOrderTraverse(BiTree T,int level)
{
    if(T==NULL)
    {
        return;
    }
    else
    {
        InOrderTraverse(T->lchild,level+1);
        Display(T->data);
        Floor(T->data,level);
        InOrderTraverse(T->rchild,level+1);
    }
}
//递归后序遍历
void PostOrderTraverse(BiTree T,int level)
{
    if(T==NULL)
    {
        return;
    }
    else
    {
        PostOrderTraverse(T->lchild,level+1);
        PostOrderTraverse(T->rchild,level+1);
        Display(T->data);
        Floor(T->data,level);
    }
}

int main()
{
    int level=1;//表示层数
    BiTree T=NULL;
    cout<<"请以前序遍历的方式输入二叉树:";//类似输入AB#D##C##
    CreateBiTree(&T);//建立二叉树,没有树,无法遍历

    cout<<"递归前序遍历输出:"<<endl;
    PostOrderTraverse(T,level);
    cout<<end;

    cout<<"递归中序遍历输出为:"<<end;
    InOrderTraverse(T,level);
    cout<<endl;

    cout<<"递归后序遍历输出为:"<<endl;
    PostOrderTraverse(T,level);
    cout<<endl;

    return 0;
}
View Code

 

 

by author:Foreordination

2018-02-06 17:06:22

以上是关于二叉树的遍历的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的遍历

讲透学烂二叉树:二叉树的遍历图解算法步骤及JS代码

二叉树(2.二叉树的遍历和实现)

根据二叉树的前序遍历和中序遍历构建二叉树的c语言完整代码

通过遍历序列构造二叉树(扩展二叉树的先序先序和中序后序和中序层序和中序)附可执行完整代码

代码题— 二叉树的层次遍历