二叉树的各种基本运算
码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢 支持原创 。
欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在次谢谢大家。
在计算机科学中,二叉树(英语: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 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);
}
结果展示
结果正确
附录
相关资料
源代码
码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创 。
#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);
}
码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢 支持原创 。