编写非递归遍历算法,实现:给定一棵二叉树的先序遍历序列和中序遍历序列,创建这文树。 (1)输出二叉树的后序遍历的结点序列。 (2)输出二叉树的叶子结点。 (3)统计二叉树的结点个数。 . (4)求二叉树的深度。用C语言实现

时间: 2023-06-24 09:05:22 浏览: 76
您好,我理解了您的问题,以下是我的回答: 1. 编写非递归遍历算法,实现:给定一棵二叉树的先序遍历序列和中序遍历序列,创建这棵树。 可以使用栈来实现非递归遍历。具体实现如下: ```c #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef struct TreeNode { char data; struct TreeNode *left; struct TreeNode *right; } TreeNode; typedef struct Stack { int top; TreeNode *data[MAXSIZE]; } Stack; void initStack(Stack *stack) { stack->top = -1; } int isEmpty(Stack *stack) { return stack->top == -1; } int isFull(Stack *stack) { return stack->top == MAXSIZE - 1; } void push(Stack *stack, TreeNode *node) { if (isFull(stack)) { return; } stack->top++; stack->data[stack->top] = node; } TreeNode* pop(Stack *stack) { if (isEmpty(stack)) { return NULL; } TreeNode *node = stack->data[stack->top]; stack->top--; return node; } TreeNode* createTree(char *preOrder, char *inOrder, int length) { if (preOrder == NULL || inOrder == NULL || length <= 0) { return NULL; } TreeNode *root = (TreeNode *) malloc(sizeof(TreeNode)); root->data = *preOrder; root->left = NULL; root->right = NULL; int rootIndex = 0; for (int i = 0; i < length; i++) { if (*(inOrder + i) == *preOrder) { rootIndex = i; break; } } root->left = createTree(preOrder + 1, inOrder, rootIndex); root->right = createTree(preOrder + rootIndex + 1, inOrder + rootIndex + 1, length - rootIndex - 1); return root; } void nonRecursivePreOrder(TreeNode *root) { if (root == NULL) { return; } Stack stack; initStack(&stack); TreeNode *node = root; while (node != NULL || !isEmpty(&stack)) { while (node != NULL) { printf("%c ", node->data); push(&stack, node); node = node->left; } if (!isEmpty(&stack)) { node = pop(&stack)->right; } } } void nonRecursiveInOrder(TreeNode *root) { if (root == NULL) { return; } Stack stack; initStack(&stack); TreeNode *node = root; while (node != NULL || !isEmpty(&stack)) { while (node != NULL) { push(&stack, node); node = node->left; } if (!isEmpty(&stack)) { node = pop(&stack); printf("%c ", node->data); node = node->right; } } } void nonRecursivePostOrder(TreeNode *root) { if (root == NULL) { return; } Stack stack1, stack2; initStack(&stack1); initStack(&stack2); TreeNode *node = root; push(&stack1, node); while (!isEmpty(&stack1)) { node = pop(&stack1); push(&stack2, node); if (node->left != NULL) { push(&stack1, node->left); } if (node->right != NULL) { push(&stack1, node->right); } } while (!isEmpty(&stack2)) { node = pop(&stack2); printf("%c ", node->data); } } void printLeaves(TreeNode *root) { if (root == NULL) { return; } if (root->left == NULL && root->right == NULL) { printf("%c ", root->data); } printLeaves(root->left); printLeaves(root->right); } int countNodes(TreeNode *root) { if (root == NULL) { return 0; } return 1 + countNodes(root->left) + countNodes(root->right); } int maxDepth(TreeNode *root) { if (root == NULL) { return 0; } int leftDepth = maxDepth(root->left) + 1; int rightDepth = maxDepth(root->right) + 1; return leftDepth > rightDepth ? leftDepth : rightDepth; } int main() { char *preOrder = "ABDECFG"; char *inOrder = "DBEAFCG"; TreeNode *root = createTree(preOrder, inOrder, 7); printf("前序遍历结果:"); nonRecursivePreOrder(root); printf("\n"); printf("中序遍历结果:"); nonRecursiveInOrder(root); printf("\n"); printf("后序遍历结果:"); nonRecursivePostOrder(root); printf("\n"); printf("叶子节点结果:"); printLeaves(root); printf("\n"); printf("结点个数结果:%d\n", countNodes(root)); printf("深度结果:%d\n", maxDepth(root)); return 0; } ``` 2. 输出二叉树的后序遍历的结点序列。 可以使用两个栈来实现。具体实现如上面所示的代码中的 `nonRecursivePostOrder` 函数。 3. 输出二叉树的叶子结点。 可以使用递归来实现。具体实现如上面所示的代码中的 `printLeaves` 函数。 4. 统计二叉树的结点个数。用C语言实现。 可以使用递归来实现。具体实现如上面所示的代码中的 `countNodes` 函数。 5. 求二叉树的深度。 可以使用递归来实现。具体实现如上面所示的代码中的 `maxDepth` 函数。

相关推荐

最新推荐

recommend-type

通过先序遍历和中序遍历后的序列还原二叉树(实现方法)

下面小编就为大家带来一篇通过先序遍历和中序遍历后的序列还原二叉树(实现方法)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数

[问题描述] 建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数。 [基本要求] 要求根据读取的元素建立二叉树,能输出各种遍历。 [实现提示] 可通过输入带空格的前序序列建立二叉链表。
recommend-type

C++ 数据结构二叉树(前序/中序/后序递归、非递归遍历)

主要介绍了C++ 数据结构二叉树(前序/中序/后序递归、非递归遍历)的相关资料,这里提供实例代码来帮助大家理解掌握二叉树,需要的朋友可以参考下
recommend-type

用Python实现二叉树、二叉树非递归遍历及绘制的例子

今天小编就为大家分享一篇用Python实现二叉树、二叉树非递归遍历及绘制的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
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编写api接口

在Python中编写API接口可以使用多种框架,其中比较流行的有Flask和Django。这里以Flask框架为例,简单介绍如何编写API接口。 1. 安装Flask框架 使用pip命令安装Flask框架: ``` pip install flask ``` 2. 编写API接口 创建一个Python文件,例如app.py,编写以下代码: ```python from flask import Flask, jsonify app = Flask(__name__) @app.route('/api/hello', methods=['GET']) def hello():
recommend-type

JSBSim Reference Manual

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

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依