【数据结构】二叉树的链式存储结构(通过前序序列和中序序列构造二叉树

article/2025/6/24 2:19:26

说明:需要分别输入要二叉树的前序序列和中序序列才能构建二叉树。如果构建失败,程序会报错。
在这里插入图片描述
比如我们给定一个二叉树,容易知道
前序序列为:GDAFEMHZ
中序序列为:ADEFGHMZ
程序运行结果:
在这里插入图片描述
源代码

#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<math.h>
#include<queue>
#define TURE 1
#define ERROR 0
#define N 100
using namespace std;
typedef int Status;
typedef char ElemType;
/*定义二叉树的存储类型*/
typedef struct BitNode
{ElemType data;          //结点元素struct BitNode* lchild; // 左孩子指针struct BitNode* rchild; //右孩子指针
} BitNode,*BiTree;
void InitBiTree(BiTree* T)
{*T = NULL;
}
void ClearBiTree(BiTree* T)
{   //清空二叉树if(*T){if((*T)->lchild)ClearBiTree(&((*T)->lchild));if((*T)->rchild)ClearBiTree(&((*T)->rchild));free(*T);*T=NULL;}
}
Status BiTreeEmpty(BiTree T)
{return T==NULL?TURE:ERROR;
}
//由前序序列和中序序列建立二叉树的过程
/* 算法
1、通过先序遍历找到根结点A,再通过A在中序遍历的位置找出左子树,右子树
2、在A的左子树中,找左子树的根结点(在先序中找),重新开始步骤1
3、在A的右子树中,找右子树的根结点(在先序中找),重新开始步骤1
*///根据先序遍历和中序遍历创建二叉树
BiTree createBiTree(char *pre, char *in, int n)//pre存放前序序列,in存放中序序列,n为序列的长度
{int i=0;int n1=0,n2=0;int m1=0,m2=0;BiTree node = NULL;char lchild_pre[N],rchild_pre[N] ;//lchild_pre[N] 存放前序序列中的左子树;rchild_pre[N]存放前序序列中的右子树char lchild_in[N],rchild_in[N]; //lchild_in[N]存放中序序列中的左子树;rchild_in[N]存放中序序列中的右子树if(n==0){return NULL;}node = (BiTree)malloc(sizeof(BitNode));if(node==NULL){return NULL;}node->data = pre[0]; //前序序列的第一个元素一定是根节点for(i=0; i<n; i++){//求前序序列中的左子树和右子树if((i<=n1)&&(in[i]!=pre[0])){lchild_in[n1++]=in[i];}else if(in[i]!=pre[0]){rchild_in[n2++] = in[i];}}for(i=1; i<n; i++){//求中序序列中的左子树和右子树if(i<(n1+1)){lchild_pre[m1++]=pre[i];}else{rchild_pre[m2++]=pre[i];}}//使用递归,分别插入左子树和右子树node->lchild =createBiTree(lchild_pre,lchild_in,n1);node->rchild =createBiTree(rchild_pre,rchild_in,n2);return node;}
int HeightOfBiTree(BiTree root)
{   //求二叉树的高度int treeHeight = 0;if (root != NULL){int leftHeight = HeightOfBiTree(root->lchild);int rightHeight = HeightOfBiTree(root->rchild);treeHeight = (leftHeight >= rightHeight)? (leftHeight + 1):(rightHeight + 1);}return treeHeight;
}
int WidthOfBiTree(BiTree root)
{   //求二叉树的宽度if(root==NULL){return 0;}int width = 0;int maxWidth = 0;queue<BiTree > Q;BiTree p = NULL;Q.push(root);while(!Q.empty()){width = Q.size();if(maxWidth < width){maxWidth = width;}for(int i=0; i<width; i++){p = Q.front();Q.pop();if(p->lchild){Q.push(p->lchild);}if(p->rchild){Q.push(p->rchild);}}}return maxWidth;
}
int NodeCount(BiTree root)
{   //求二叉树的结点数量if(root==NULL)return 0;elsereturn NodeCount(root->lchild)+NodeCount(root->rchild)+1;
}
int LeafNodeCount(BiTree root){//求二叉树的叶子结点个数if(root==NULL)return 0;if(root->lchild==NULL&&root->rchild==NULL)return 1;return LeafNodeCount(root->lchild)+LeafNodeCount(root->rchild);
}
void preOrder(BiTree root)
{   //二叉树的前序遍历if (root==NULL){return;}printf("%c ",root->data);preOrder(root->lchild);preOrder(root->rchild);
}void inOrder(BiTree root)
{   //二叉树的中序遍历if (root==NULL){return;}inOrder(root->lchild);printf("%c ",root->data);inOrder(root->rchild);
}
void PostOrder(BiTree root)
{   //后序遍历if (root==NULL){return;}PostOrder(root->lchild);PostOrder(root->rchild);printf("%c ",root->data);
}
int main()
{char preNode[N];char inNode[N];int n = 0;char ch;BitNode* root=NULL;printf("请输入二叉树的先序序列\n");while((ch = getchar())&&ch!='\n')preNode[n++] = ch;printf("请输入二叉树的中序序列\n");n = 0;while((ch = getchar())&&ch!='\n')inNode[n++] = ch;root = createBiTree(preNode,inNode,n);printf("二叉树创建成功\n");printf("先序序列\n");preOrder(root);printf("\n中序序列\n");inOrder(root);printf("\n后序序列\n");PostOrder(root);printf("\n");int height =HeightOfBiTree(root);printf("\n二叉树的高度为:%d\n",height);int width =WidthOfBiTree(root);printf("\n二叉树的宽度为:%d\n",width);int Node =NodeCount(root);printf("\n二叉树的结点数量为:%d\n",Node);int leaf =LeafNodeCount(root);printf("\n二叉树的叶子结点为:%d\n",leaf);system("pause");return 0;
}

http://chatgpt.dhexx.cn/article/9pgTsRlO.shtml

相关文章

二叉树:已知前序序列与后序序列建树

二叉树&#xff1a;已知前序与后序建树 已知前序与中序、后序与中序建树是常遇到的算法问题。若已知前序序列与后序序列&#xff0c;要求输出满足条件的树的个数或者输出所有可能的树的中序序列&#xff0c;该怎么解决&#xff1f;下面我们一步步讨论这个问题。 首先&#xf…

LeetCode 每日一题331. 验证二叉树的前序序列化

331. 验证二叉树的前序序列化 序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时&#xff0c;我们可以记录下这个节点的值。如果它是一个空节点&#xff0c;我们可以使用一个标记值记录&#xff0c;例如 #。 _9_/ \3 2/ \ / \4 1 # 6 / \ / \ / …

试证明:已知二叉树的前序序列和中序序列,可以唯一确定该二叉树

假设二叉树BT的总的结点个数为n&#xff0c;前序序列pre为&#xff0c;中序序列pin为&#xff0c;现用数学归纳法证明pre和pin可以唯一确定这棵二叉树&#xff1a; 1. n 1时&#xff0c;前序和中序序列都各只有一个元素&#xff0c;&#xff0c;此时等于&#xff0c;为BT的根…

验证二叉树的前序序列化[抽象前序遍历]

抽象前序遍历 前言一、验证二叉树的前序序列化二、抽象前序遍历总结参考文献 前言 难题要么复杂&#xff0c;要么未知&#xff0c;要么就是抽象考察&#xff0c;这三种类型都比较锻炼分析问题的能力。 一、验证二叉树的前序序列化 二、抽象前序遍历 package everyday.tree;p…

通过前序序列和中序序列或中序序列和后序序列还原二叉树(Java)

首先看一下这个二叉树的结构&#xff0c;回忆一下前序序列的输出方式&#xff08;中前后&#xff09;&#xff0c;中序序列的输出方式&#xff08;前中后&#xff09;&#xff0c;后序序列的输出方式&#xff08;前后中&#xff09;。 前中序列还原二叉树 此二叉树的前中序列…

已知前序序列和中序序列重建二叉树

一.解决方法&#xff1a; 在相关的书籍中描述了一个递归的解决方法&#xff0c;其算法思想如下&#xff1a; 1.从前序序列中第一个元素开始&#xff0c;取出一个元素&#xff0c;索引后移一位&#xff08;preIndex1&#xff09; 2.根据选择到的数值创建一个树节点newNode 3.然…

7-3 前序序列创建二叉树 (25 分) PTA

编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以二叉链表存储&#xff09;。 例如如下的先序遍历字符串&#xff1a; ABC##DE#G##F### 其中“#”表示的是空格&#xff0c;代表一棵空树。然后再对二叉树进行中序遍…

C++实现 利用前序序列和中序序列构建二叉树

前言&#xff1a;已知一个二叉树的中序序列和前序序列&#xff0c;或者中序序列和后序序列就可以唯一确定一个二叉树&#xff08;必须知道中序序列&#xff09;&#xff0c;只知道前序和后序不能创建唯一的二叉树。 1.引例 已知下列某二叉树(8个结点)的两个序列&#xff0c;如…

7-2 前序序列创建二叉树

7-2 前序序列创建二叉树 (25 分) 编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以二叉链表存储&#xff09;。 例如如下的先序遍历字符串&#xff1a; ABC##DE#G##F### 其中“#”表示的是空格&#xff0c;代表一…

由序列确定二叉树:前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 代码实现(c语言)

下面三种序列可以唯一的构造唯一的一棵二叉树&#xff1a; 前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #…

python实现根据前序序列和中序序列求二叉树的后序序列

根据前序序列求根结点&#xff0c;根据中序序列求左右子树。 如上图&#xff1a;根据前序序列&#xff0c;谁在前面谁就是根结点&#xff1b;根据根结点&#xff0c;确定左右子树。 class BiTreeNode:def __init__(self, data):self.data dataself.lchild Noneself.rchild …

已知二叉树的前序序列跟中序序列求后序序列(C语言)

原理是&#xff0c;比如 先序序列决定二叉树的根结点&#xff08;比如上图的“1”&#xff09;&#xff0c;后序序列决定二叉树的左右子结点&#xff08;比如上图的“4”&#xff0c;“7”&#xff0c;“2”为左子树的那部分&#xff0c;而“8”&#xff0c;“5”&#xff0c;“…

验证二叉树的前序序列化

缩点法验证二叉树的前序序列化 题目解决思路代码说明 题目 &#xff08;1&#xff09;序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时&#xff0c;我们可以记录下这个节点的值。如果它是一个空节点&#xff0c;我们可以使用一个标记值记录&#xff0c;例如 …

验证二叉树的前序序列化Python解法

序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时&#xff0c;我们可以记录下这个节点的值。如果它是一个空节点&#xff0c;我们可以使用一个标记值记录&#xff0c;例如 #。 例如&#xff0c;上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1,#,#,2,#,…

7-1 前序序列创建二叉树

7-1 前序序列创建二叉树 编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以二叉链表存储&#xff09;。 例如如下的先序遍历字符串&#xff1a; ABC##DE#G##F### 其中“#”表示的是空格&#xff0c;代表一棵空树。…

超容易理解的数据结构前序,中序和后序序列

今天听了我们数据结构老师讲三序序列&#xff0c;发现有很多同学不能根据二叉树推&#xff0c;特发此文讲解。 对于三序序列&#xff0c;我们可以选择构造一个表格并创造一个指针&#xff0c;将指针指于二叉树根结点&#xff0c;对应表格则如下所示&#xff0c;若某节点无左孩…

IIC通信协议详解[转载]

IIC的基本介绍 IIC的简介 IIC&#xff08;Inter&#xff0d;Integrated Circuit&#xff09;总线是一种由PHILIPS公司在80年代开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备。它是半双工通信方式。 IIC总线最主要的优点是其简单性和有效性。由于接口直接在组件…

IIC通信协议学习

1.IIC简介 IIC&#xff1a;Inter-Integrated Circuit&#xff08;内部集成电路&#xff09; 需要两个管脚&#xff1a;SDA、SCL SPI协议&#xff1a;一个主设备对多个从设备&#xff0c;每增加一个从设备&#xff0c;需要增加一个端口CS* 特点&#xff1a;速度较快&#xff…

IIC总线设计①——IIC通信协议

目录 一、IIC&#xff08;Inter-Integrated Circuit&#xff09;总线介绍 二、IIC协议 &#xff08;一&#xff09;IIC通信过程 &#xff08;二&#xff09;起始信号和停止信号 程序 &#xff08;三&#xff09;应答信号和非应答信号 程序 &#xff08;四&#xff09;数…

STM32基于IIC通信协议的OLED模块使用(详解)

目录 前言 一、项目内容 实验简介 二、IIC模块 1、IIC协议简介 2、物理层 3、协议层 4、硬件IIC代码配置 5、软件模拟IIC配置 1、起始信号与停止信号 2、从机应答信号 3、数据的有效性 4、数据传输 三、OLED模块 1、软件配置 2、OLED原理 1、OLED初始化函数 …