二叉树的各种基本运算

二叉树的各种基本运算


码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢 支持原创

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

  在计算机科学中,二叉树(英语: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 0

typedef  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 0

typedef  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; 
}//PreOrderTraverse

Status 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);   
}

码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢 支持原创

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值