• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Foreordination
酒后高歌磨剑,梦中快意恩仇,名利脚下踩,情义两肩挑
博客园    首页    新随笔    联系   管理    订阅  订阅
二叉树的遍历

一、二叉树的遍历:

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

posted on 2018-02-06 17:07  Foreordination  阅读(151)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3