二叉树的各种基本运算
来源:互联网 发布:xtream path mac 编辑:程序博客网 时间:2024/05/18 01:59
二叉树的各种基本运算
欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在次谢谢大家。
在计算机科学中,二叉树(英语:Binary tree)是每个节点最多只有两个分支(不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”和“右子树”。二叉树的分支具有左右次序,不能颠倒。维基百科-二叉树
实验环境
- 语言c/c++
- 编译器devc++5.11/5.40
实验内容与要求
- 编写一个程序,建立如图所示二叉树。
- 实现二叉树的先序遍历、中序遍历和后序遍历的各种递归算法,要求设计一个菜单提供遍历种类的选择。
目录
- 二叉树的各种基本运算
- 实验环境
- 实验内容与要求
- 目录
- 实验解析
- 结构说明
- 定义说明
- 函数说明
- 二叉树函数
- 创建二叉树
- 先序遍历输出
- 中序遍历输出
- 后序遍历输出
- 释放
- 主函数
- 二叉树函数
- 结果展示
- 附录
- 相关资料
- 源代码
实验解析
结构说明
二叉树是n(n≥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); }
结果展示
结果正确
附录
相关资料
- 维基百科-二叉树
- 维基百科-遍历二叉树
源代码
#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); }
阅读全文
1 0
- 二叉树各种基本运算的算法
- 二叉树的各种基本运算
- 实现二叉树的各种基本运算的算法
- 实现二叉树各种基本运算的算法
- 二叉树的各种基本操作运算多文件组织
- 实现二叉树的各种基本运算方法
- 二叉树的基本运算
- 二叉树的基本运算
- 二叉树的基本运算
- 二叉树的基本运算
- 数据结构之二叉树的各种运算
- 二叉树的基本运算实验
- 二叉树的基本运算实验
- 遍历二叉树的基本运算
- 二叉树的一些基本运算
- 数据结构学习-二叉树的基本运算
- Java实现二叉树的基本运算
- 数据结构---二叉树的基本运算
- ssm下使用ueditor(jsp版本)编辑器自定义路径上传图片到公司服务器。(之前写的被误删了)
- 【51nod1220】约数之和
- Properties配置文件读取不到
- C# 委托
- Kafka_基础和架构
- 二叉树的各种基本运算
- Leetcode题解-25. Reverse Nodes in k-Group
- jsp编译报错:Multiple annotations found at this line:
- javaMail直接发送附件,无须生成临时文件
- 使用Jenkins配置SpringBoot的自动化构建
- android开发案例
- Flex柱状图
- delphi 获取文件所在路径
- 【Scikit-Learn 中文文档】预测目标 (y) 的转换