二叉树的各种基本运算

来源:互联网 发布:xtream path mac 编辑:程序博客网 时间:2024/05/18 01:59

二叉树的各种基本运算


  欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在次谢谢大家。

  在计算机科学中,二叉树(英语:Binary tree)是每个节点最多只有两个分支(不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”和“右子树”。二叉树的分支具有左右次序,不能颠倒。维基百科-二叉树


实验环境


  • 语言c/c++
  • 编译器devc++5.11/5.40


实验内容与要求

二叉树

  1. 编写一个程序,建立如图所示二叉树。
  2. 实现二叉树的先序遍历、中序遍历和后序遍历的各种递归算法,要求设计一个菜单提供遍历种类的选择。


目录


  • 二叉树的各种基本运算
    • 实验环境
    • 实验内容与要求
  • 目录
  • 实验解析
    • 结构说明
    • 定义说明
    • 函数说明
      • 二叉树函数
        • 创建二叉树
        • 先序遍历输出
        • 中序遍历输出
        • 后序遍历输出
        • 释放
      • 主函数
    • 结果展示
  • 附录
    • 相关资料
    • 源代码


实验解析

结构说明


二叉树nn≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

在此,我们利用二叉链表的形式来定义二叉树:

typedef   struct   BiTNode{    TElemType    data;    struct   BiTNode *lchild , *rchild;}BiTNode,*BiTree;

二叉链表的结点结构如图所示。

二叉链表的结点结构


定义说明


#define OVERFLOW 0#define OK 1#define ERROR 0typedef  int  Status;typedef  char TElemType;    char ch[] = {'A', 'B', 'D','#','#','E','H','J','#','#','K','L','#','#','M','#','N','#','#','#','C','F','#','#','G','#','I','#','#'};//简易版,先序排列,空节点以#代替,可以加一个输入来自己写二叉树。因为创建二叉树是自我递归,所以要设为全局变量    int j =0 ;//因为创建二叉树是自我递归,所以要设为全局变量,可以使用栈来替换递归。

  定义常用常量,类型别称


函数说明


二叉树函数

创建二叉树

Status CreateBiTree(BiTree &T){    if(ch[j]=='#') {        T=NULL;        j++;    }else{        if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))             exit(OVERFLOW);        T->data=ch[j];        j++;        CreateBiTree(T->lchild);        CreateBiTree(T->rchild);    }    return OK;} 

   给二叉树分配空间 ,建立二叉树空间结构,成功返回1,失败则结束程序。 使用二叉树一定要先初始化再使用


先序遍历输出

Status PreOrderTraverse(BiTree  T){     if(T) {          printf("%c",T->data);        PreOrderTraverse(T->lchild);        PreOrderTraverse(T->rchild);        return  OK;    }else           return  ERROR; }//PreOrderTraverse

  以前序遍历输出二叉树,成功返回1,失败返回0。

​ 遍历二叉树:L、D、R分别表示遍历左子树、访问根结点和遍历右子树,则先(根)序遍历二叉树的顺序是DLR,中(根)序遍历二叉树的顺序是LDR,后(根)序遍历二叉树的顺序是LRD。维基百科-遍历二叉树


中序遍历输出

Status InOrderTraverse(BiTree T){     if(T) {         InOrderTraverse(T->lchild);         printf("%c",T->data);         InOrderTraverse(T->rchild);         return  OK;    }else           return  ERROR; }

  以中序遍历输出二叉树,成功返回1,失败返回0。


后序遍历输出

Status PostOrderTraverse(BiTree T){     if(T) {         PostOrderTraverse(T->lchild);        PostOrderTraverse(T->rchild);         printf("%c",T->data);         return  OK;   }else           return  ERROR; }

  以后序遍历输出二叉树,成功返回1,失败返回0。


释放

Status DestroyBiTree (BiTree &T) {         if (!T)          return ERROR;     DestroyBiTree(T->lchild);    DestroyBiTree(T->rchild);    free(T);    if(!T)            return OK;}

   释放传入的二叉树,成功返回1,失败返回0


主函数


main(){    int i;    BiTree T;    CreateBiTree(T);    printf("输入1进行先序遍历\n输入2进行中序遍历\n输入3进行后序遍历\n");    scanf("%d",&i);    if(T){        switch(i){            case 1:                PreOrderTraverse(T);                break;            case 2:                InOrderTraverse(T);                 break;            case 3:                PostOrderTraverse(T);                break;            default:                    printf("error\n");        }    }    DestroyBiTree(T);   }


结果展示


二叉树先序遍历结果截图

二叉树中序遍历结果截图

二叉树后序遍历结果截图

结果正确


附录

相关资料

  1. 维基百科-二叉树
  2. 维基百科-遍历二叉树


源代码


#include<stdio.h>#include<stdlib.h>#include <string> #define OVERFLOW 0#define OK 1#define ERROR 0typedef  int  Status;typedef  char TElemType;char ch[] = {'A', 'B', 'D','#','#','E','H','J','#','#','K','L','#','#','M','#','N','#','#','#','C','F','#','#','G','#','I','#','#'};int j =0 ;typedef   struct   BiTNode{    TElemType    data;    struct   BiTNode *lchild,*rchild;}BiTNode,*BiTree;Status CreateBiTree(BiTree &T){    if(ch[j]=='#') {        T=NULL;        j++;    }else{        if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))             exit(OVERFLOW);        T->data=ch[j];        j++;        CreateBiTree(T->lchild);        CreateBiTree(T->rchild);    }    return OK;} Status PreOrderTraverse(BiTree  T){     if(T) {          printf("%c",T->data);        PreOrderTraverse(T->lchild);        PreOrderTraverse(T->rchild);        return  OK;    }else           return  ERROR; }//PreOrderTraverseStatus InOrderTraverse(BiTree T){     if(T) {         InOrderTraverse(T->lchild);         printf("%c",T->data);         InOrderTraverse(T->rchild);         return  OK;    }else           return  ERROR; }Status PostOrderTraverse(BiTree T){     if(T) {         PostOrderTraverse(T->lchild);        PostOrderTraverse(T->rchild);         printf("%c",T->data);         return  OK;   }else           return  ERROR; }Status DestroyBiTree (BiTree &T) {         if (!T)          return ERROR;     DestroyBiTree(T->lchild);    DestroyBiTree(T->rchild);    free(T);    if(!T)            return OK;}main(){    int i;    BiTree T;    CreateBiTree(T);    printf("输入1进行先序遍历\n输入2进行中序遍历\n输入3进行后序遍历\n");    scanf("%d",&i);    if(T){        switch(i){            case 1:                PreOrderTraverse(T);                break;            case 2:                InOrderTraverse(T);                 break;            case 3:                PostOrderTraverse(T);                break;            default:                    printf("error\n");        }    }    DestroyBiTree(T);   }