(1) 二叉树的相关操作演示。 自定义结点结构,以二叉链表为存储结构,完成以下功能: 1) 以先序递归方式创建一棵二叉树; 2) 输出二叉树的先序、中序和后序递归或非递归遍历下的结点访问次序; 3) 输出二叉树所有的叶子节点和叶子节点个数; 4) 输出二叉树的高度; 5) 输出二叉树的按层次遍历序列(提示:实现需用到队列); 6) 输出二叉树的形状

时间: 2024-02-09 10:09:42 浏览: 25
好的,这是一个用C语言实现二叉树的示例代码,其中包含了先序递归方式创建二叉树、二叉树的遍历、叶子节点的查找、二叉树的高度、按层次遍历二叉树和输出二叉树形状等功能。 ```c #include <stdio.h> #include <stdlib.h> // 二叉树节点结构 struct TreeNode { char val; struct TreeNode *left; struct TreeNode *right; }; // 创建一个新节点 struct TreeNode* new_node(char val) { struct TreeNode *node = (struct TreeNode*)malloc(sizeof(struct TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } // 以先序递归方式创建二叉树 struct TreeNode* create_tree() { char val; printf("请输入节点的值(输入#表示空节点):"); scanf(" %c", &val); if (val == '#') { return NULL; } struct TreeNode *node = new_node(val); node->left = create_tree(); node->right = create_tree(); return node; } // 先序递归遍历二叉树 void pre_order_recursive(struct TreeNode *root) { if (root == NULL) { return; } printf("%c ", root->val); pre_order_recursive(root->left); pre_order_recursive(root->right); } // 中序递归遍历二叉树 void in_order_recursive(struct TreeNode *root) { if (root == NULL) { return; } in_order_recursive(root->left); printf("%c ", root->val); in_order_recursive(root->right); } // 后序递归遍历二叉树 void post_order_recursive(struct TreeNode *root) { if (root == NULL) { return; } post_order_recursive(root->left); post_order_recursive(root->right); printf("%c ", root->val); } // 前序非递归遍历二叉树 void pre_order_iterative(struct TreeNode *root) { if (root == NULL) { return; } struct TreeNode *stack[100]; int top = -1; stack[++top] = root; while (top >= 0) { struct TreeNode *node = stack[top--]; printf("%c ", node->val); if (node->right) { stack[++top] = node->right; } if (node->left) { stack[++top] = node->left; } } } // 中序非递归遍历二叉树 void in_order_iterative(struct TreeNode *root) { if (root == NULL) { return; } struct TreeNode *stack[100]; int top = -1; struct TreeNode *p = root; while (top >= 0 || p) { while (p) { stack[++top] = p; p = p->left; } p = stack[top--]; printf("%c ", p->val); p = p->right; } } // 后序非递归遍历二叉树 void post_order_iterative(struct TreeNode *root) { if (root == NULL) { return; } struct TreeNode *stack1[100]; struct TreeNode *stack2[100]; int top1 = -1; int top2 = -1; stack1[++top1] = root; while (top1 >= 0) { struct TreeNode *node = stack1[top1--]; stack2[++top2] = node; if (node->left) { stack1[++top1] = node->left; } if (node->right) { stack1[++top1] = node->right; } } while (top2 >= 0) { printf("%c ", stack2[top2--]->val); } } // 查找二叉树的叶子节点 void find_leaf_nodes(struct TreeNode *root, char *nodes, int *count) { if (root == NULL) { return; } if (root->left == NULL && root->right == NULL) { nodes[*count] = root->val; (*count)++; } find_leaf_nodes(root->left, nodes, count); find_leaf_nodes(root->right, nodes, count); } // 计算二叉树的高度 int get_tree_height(struct TreeNode *root) { if (root == NULL) { return 0; } int left_height = get_tree_height(root->left); int right_height = get_tree_height(root->right); return (left_height > right_height) ? left_height + 1 : right_height + 1; } // 按层次遍历二叉树 void level_order_traversal(struct TreeNode *root) { if (root == NULL) { return; } struct TreeNode *queue[100]; int front = 0; int rear = 0; queue[rear++] = root; while (front < rear) { struct TreeNode *node = queue[front++]; printf("%c ", node->val); if (node->left) { queue[rear++] = node->left; } if (node->right) { queue[rear++] = node->right; } } } // 输出二叉树形状 void print_tree_shape(struct TreeNode *root, int level) { if (root == NULL) { return; } print_tree_shape(root->right, level+1); int i; for (i = 0; i < level; i++) { printf(" "); } printf("%c\n", root->val); print_tree_shape(root->left, level+1); } int main() { struct TreeNode *root = create_tree(); printf("先序递归遍历:"); pre_order_recursive(root); printf("\n"); printf("中序递归遍历:"); in_order_recursive(root); printf("\n"); printf("后序递归遍历:"); post_order_recursive(root); printf("\n"); printf("先序非递归遍历:"); pre_order_iterative(root); printf("\n"); printf("中序非递归遍历:"); in_order_iterative(root); printf("\n"); printf("后序非递归遍历:"); post_order_iterative(root); printf("\n"); char leaf_nodes[100]; int leaf_count = 0; find_leaf_nodes(root, leaf_nodes, &leaf_count); printf("叶子节点:"); int i; for (i = 0; i < leaf_count; i++) { printf("%c ", leaf_nodes[i]); } printf("\n"); int height = get_tree_height(root); printf("树的高度:%d\n", height); printf("按层次遍历:"); level_order_traversal(root); printf("\n"); printf("树的形状:\n"); print_tree_shape(root, 0); return 0; } ``` 在这个示例代码中,我们首先实现了一个`create_tree`函数,用于以先序递归方式创建二叉树。接着,我们实现了先序、中序和后序递归遍历二叉树的函数,以及先序、中序和后序非递归遍历二叉树的函数。我们还实现了一个`find_leaf_nodes`函数,用于查找二叉树的叶子节点,一个`get_tree_height`函数,用于计算二叉树的高度,一个`level_order_traversal`函数,用于按层次遍历二叉树,以及一个`print_tree_shape`函数,用于输出二叉树的形状。 您可以根据自己的需要使用这个示例代码,并根据自己的情况进行修改。

相关推荐

最新推荐

recommend-type

数据结构 建立二叉树二叉链表存储结构实现有关操作 实验报告

建立二叉树的二叉链表存储结构实现以下操作(选择其中的两个做) (1)输出二叉树 (2)先序遍历二叉树 (3) 中序遍历二叉树 (4)后序遍历二叉树 (5)层次遍历二叉树
recommend-type

数据结构课程设计二叉树采用二叉链表作为存储结构

编写按层次顺序(同一层自左至右)遍历二叉树的算法。...(1)二叉树采用二叉链表作为存储结构。 (2)按题集p44面题6.69所指定的格式输出建立的二叉树。 (3)输出层次遍历结果。 (4)测试用例自己设计。
recommend-type

数据结构综合课设二叉树的建立与遍历.docx

从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),并采用递归算法对其进行遍历(先序、中序、后序),将遍历结果打印输出。 3.测试要求: ABCффDEфGффFффф(其中ф表示空格...
recommend-type

递归删除二叉树中以x为根的子树

今天小编就为大家分享一篇关于递归删除二叉树中以x为根的子树,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
recommend-type

哈尔滨工程大学833社会研究方法2020考研专业课初试大纲.pdf

哈尔滨工程大学考研初试大纲
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

MATLAB结构体与对象编程:构建面向对象的应用程序,提升代码可维护性和可扩展性

![MATLAB结构体与对象编程:构建面向对象的应用程序,提升代码可维护性和可扩展性](https://picx.zhimg.com/80/v2-8132d9acfebe1c248865e24dc5445720_1440w.webp?source=1def8aca) # 1. MATLAB结构体基础** MATLAB结构体是一种数据结构,用于存储和组织相关数据。它由一系列域组成,每个域都有一个名称和一个值。结构体提供了对数据的灵活访问和管理,使其成为组织和处理复杂数据集的理想选择。 MATLAB中创建结构体非常简单,使用struct函数即可。例如: ```matlab myStruct
recommend-type

详细描述一下STM32F103C8T6怎么与DHT11连接

STM32F103C8T6可以通过单总线协议与DHT11连接。连接步骤如下: 1. 将DHT11的VCC引脚连接到STM32F103C8T6的5V电源引脚; 2. 将DHT11的GND引脚连接到STM32F103C8T6的GND引脚; 3. 将DHT11的DATA引脚连接到STM32F103C8T6的GPIO引脚,可以选择任一GPIO引脚,需要在程序中配置; 4. 在程序中初始化GPIO引脚,将其设为输出模式,并输出高电平,持续至少18ms,以激活DHT11; 5. 将GPIO引脚设为输入模式,等待DHT11响应,DHT11会先输出一个80us的低电平,然后输出一个80us的高电平,
recommend-type

JSBSim Reference Manual

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