zoukankan      html  css  js  c++  java
  • 二叉树的遍历

    一、二叉树的遍历:

    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

  • 相关阅读:
    [Codeforces 933A]A Twisty Movement
    [Codeforces 100633J]Ceizenpok’s formula
    [HAOI 2011]向量
    [JSOI 2008]最大数
    [Codeforces 750E]New Year and Old Subsequence
    [BZOJ 3439]Kpm的MC密码
    [TJOI 2013]单词
    [SCOI 2011]糖果
    [BZOJ 2160]拉拉队排练
    [AtCoder arc090F]Number of Digits
  • 原文地址:https://www.cnblogs.com/drq1/p/8423165.html
Copyright © 2011-2022 走看看