用C语言设计一个程序,可实现以下内容(并且在每行代码后面进行解释说明):1.任意输入前序+中序序列(或中序+后序序列),生成唯一的二叉树,并打印其的后序序 列(或前序序列)(当用户输入错误的序列无法生成二叉树时,程序应该有错误提示); 2. 判断输入的一棵二叉树是否是二叉搜索树; 3. 输入一棵二叉搜索树,求出其中的最小和最大关键字; 4. 将该二叉搜索树转换成一个排序的双向链表(要求不能创建任何新的结点,只能调整树 中结点指针的指向)。

时间: 2024-02-05 20:10:33 浏览: 18
以下是代码及注释: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树结点 typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 根据前序+中序序列构建二叉树 TreeNode* buildTree(int* preorder, int* inorder, int preorderSize, int inorderSize) { if (preorderSize <= 0 || inorderSize <= 0) { // 当序列长度为0时,返回NULL return NULL; } TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); // 创建根结点 root->val = preorder[0]; int i; for (i = 0; i < inorderSize; i++) { // 在中序序列中找到根结点的位置 if (inorder[i] == preorder[0]) { break; } } if (i == inorderSize) { // 如果没找到,说明序列有误,返回NULL free(root); return NULL; } root->left = buildTree(preorder + 1, inorder, i, i); // 递归构建左子树 root->right = buildTree(preorder + i + 1, inorder + i + 1, preorderSize - i - 1, inorderSize - i - 1); // 递归构建右子树 return root; } // 打印二叉树的后序序列 void postorderTraversal(TreeNode* root) { if (root == NULL) { return; } postorderTraversal(root->left); // 先遍历左子树 postorderTraversal(root->right); // 再遍历右子树 printf("%d ", root->val); // 最后输出根结点 } // 判断一棵二叉树是否是二叉搜索树 int isValidBST(TreeNode* root) { static TreeNode* prev = NULL; // 静态变量,记录前一个结点 if (root == NULL) { return 1; } if (!isValidBST(root->left)) { // 遍历左子树 return 0; } if (prev != NULL && prev->val >= root->val) { // 如果前一个结点的值大于等于当前结点的值,说明不是二叉搜索树 return 0; } prev = root; // 更新前一个结点 return isValidBST(root->right); // 遍历右子树 } // 获取一棵二叉搜索树中的最小和最大关键字 void getMinMax(TreeNode* root, int* min, int* max) { if (root == NULL) { return; } if (root->val < *min) { // 如果当前结点的值比最小值还要小,更新最小值 *min = root->val; } if (root->val > *max) { // 如果当前结点的值比最大值还要大,更新最大值 *max = root->val; } getMinMax(root->left, min, max); // 遍历左子树 getMinMax(root->right, min, max); // 遍历右子树 } // 将二叉搜索树转换成排序的双向链表 TreeNode* convertBSTToList(TreeNode* root) { if (root == NULL) { return NULL; } TreeNode* left = convertBSTToList(root->left); // 转换左子树 TreeNode* right = convertBSTToList(root->right); // 转换右子树 if (left != NULL) { // 如果左子树不为空,将左子树的最右侧结点与当前结点相连 TreeNode* node = left; while (node->right != NULL) { node = node->right; } node->right = root; root->left = node; } if (right != NULL) { // 如果右子树不为空,将右子树的最左侧结点与当前结点相连 TreeNode* node = right; while (node->left != NULL) { node = node->left; } node->left = root; root->right = node; } return left != NULL ? left : root; // 返回链表的头结点 } int main() { int n, i; printf("请输入结点个数:"); scanf("%d", &n); int* preorder = (int*)malloc(n * sizeof(int)); int* inorder = (int*)malloc(n * sizeof(int)); printf("请输入前序序列:"); for (i = 0; i < n; i++) { scanf("%d", &preorder[i]); } printf("请输入中序序列:"); for (i = 0; i < n; i++) { scanf("%d", &inorder[i]); } TreeNode* root = buildTree(preorder, inorder, n, n); if (root == NULL) { // 如果构建失败,输出错误提示 printf("输入的序列无法生成二叉树!\n"); return 0; } printf("后序序列为:"); postorderTraversal(root); printf("\n"); if (isValidBST(root)) { // 判断是否是二叉搜索树 printf("该二叉树是二叉搜索树!\n"); int min = root->val, max = root->val; getMinMax(root, &min, &max); // 获取最小和最大关键字 printf("最小关键字为:%d\n", min); printf("最大关键字为:%d\n", max); TreeNode* head = convertBSTToList(root); // 转换成排序的双向链表 printf("链表中的结点为:"); TreeNode* node = head; while (node != NULL) { // 遍历链表 printf("%d ", node->val); node = node->right; } printf("\n"); } else { printf("该二叉树不是二叉搜索树!\n"); } return 0; } ```

最新推荐

recommend-type

C语言程序设计+研究生复试+求职+面试题

汇总了计算机研究生复试有关C语言程序设计各章节简答题,使用了易于口头表达的语言进行了总结。包括C语言程序设计基本概念及各章节问题回答。可供研究生复试或相关专业岗位面试使用。如: 简述C语⾔采取了哪些措施提...
recommend-type

单片机C语言程序设计:用计数器中断实现100以内的按键计数

名称:用计数器中断实现 100 以内的按键计数 ...说明:本例用 T0 计数器中断实现按键技术,由于计数寄存器初值为 1,因此 P3.4 引脚的每次负跳变都会触发 T0 中断,实现计数值累加。计数器的清零用外部中断 0 控制。
recommend-type

C语言程序设计实现区号查询系统C语言程序设计实现

用C语言编程的区号查询系统,要求实现区号查询系统中,添加新记录、删除记录、显示记录信息、按城市查找信息和退出系统等功能。 ①录入有关城市的名称和区号。 ②显示所有城市的信息。 ③通过输入城市名称查找对应...
recommend-type

单片机C语言程序设计:T0控制LED实现二进制计数

说明:本例对按键的计数没有使用查询法,没有使用外部中断函数,没有使用定时或计数中断函数。而是启用了计数器,连接在 T0 引脚的按键每次按下时,会使计数寄存器的值递增,其值通过 LED以二进制形式显示
recommend-type

C语言程序设计实现学生成绩记录簿

1)C语言课程设计的主要目的是培养学生综合运用C语言程序设计课程所学到的知识,编写C程序解决实际问题的能力,以及严谨的工作态度和良好的程序设计习惯。 2)通过课程设计的训练,学生应该能够了解程序设计的基本...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。