1.按先序序列构造一棵二叉链表表示的二叉树T; 2.对这棵二叉树进行递归遍历:先序、中序、后序以及层次遍历遍历序列,分别输出结点的遍历序列; 3. 对这棵树用非递归方式进行遍历:先序、中序以及后序遍历序列,分别输出结点的遍历序列; 4.求二叉树的深度/结点数目/叶结点数目; 5.将二叉树每个结点的左右子树交换位置; 6. 设计二叉树的双序遍历算法(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次访问这个结点,接下来按双序遍历它的右子树); 7. 计算二叉树最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值); 8. 求二叉树中第一条最长的路径长度,并输出此路径上各结点。 9.用C语言

时间: 2023-11-27 11:50:22 浏览: 54
实现以上功能。 1. 构造二叉链表表示的二叉树 ```c typedef struct BiTNode { int data; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree; // 先序遍历构造二叉树 void createBiTree(BiTree *T) { int data; scanf("%d", &data); if (data == 0) { *T = NULL; } else { *T = (BiTree) malloc(sizeof(BiTNode)); (*T)->data = data; createBiTree(&(*T)->lchild); createBiTree(&(*T)->rchild); } } ``` 2. 递归遍历二叉树 ```c // 先序遍历 void preOrderTraverse(BiTree T) { if (T) { printf("%d ", T->data); preOrderTraverse(T->lchild); preOrderTraverse(T->rchild); } } // 中序遍历 void inOrderTraverse(BiTree T) { if (T) { inOrderTraverse(T->lchild); printf("%d ", T->data); inOrderTraverse(T->rchild); } } // 后序遍历 void postOrderTraverse(BiTree T) { if (T) { postOrderTraverse(T->lchild); postOrderTraverse(T->rchild); printf("%d ", T->data); } } // 层次遍历 void levelOrderTraverse(BiTree T) { if (!T) return; Queue Q; initQueue(&Q); enQueue(&Q, T); while (!isEmptyQueue(Q)) { BiTree p = deQueue(&Q); printf("%d ", p->data); if (p->lchild) enQueue(&Q, p->lchild); if (p->rchild) enQueue(&Q, p->rchild); } } ``` 3. 非递归遍历二叉树 ```c // 先序遍历 void preOrderTraverseNonRecursion(BiTree T) { Stack S; initStack(&S); BiTree p = T; while (p || !isEmptyStack(S)) { if (p) { printf("%d ", p->data); push(&S, p); p = p->lchild; } else { p = pop(&S); p = p->rchild; } } } // 中序遍历 void inOrderTraverseNonRecursion(BiTree T) { Stack S; initStack(&S); BiTree p = T; while (p || !isEmptyStack(S)) { if (p) { push(&S, p); p = p->lchild; } else { p = pop(&S); printf("%d ", p->data); p = p->rchild; } } } // 后序遍历 void postOrderTraverseNonRecursion(BiTree T) { Stack S; initStack(&S); BiTree p = T, r = NULL; while (p || !isEmptyStack(S)) { if (p) { push(&S, p); p = p->lchild; } else { BiTree peek_elem = getTop(S); if (peek_elem->rchild && r != peek_elem->rchild) { p = peek_elem->rchild; } else { printf("%d ", peek_elem->data); r = pop(&S); } } } } ``` 4. 求二叉树的深度/结点数目/叶结点数目 ```c // 求二叉树深度 int getDepth(BiTree T) { if (!T) return 0; int left_depth = getDepth(T->lchild); int right_depth = getDepth(T->rchild); return left_depth > right_depth ? left_depth + 1 : right_depth + 1; } // 求二叉树结点数 int getNodeNum(BiTree T) { if (!T) return 0; return getNodeNum(T->lchild) + getNodeNum(T->rchild) + 1; } // 求二叉树叶结点数 int getLeafNodeNum(BiTree T) { if (!T) return 0; if (!T->lchild && !T->rchild) return 1; return getLeafNodeNum(T->lchild) + getLeafNodeNum(T->rchild); } ``` 5. 将二叉树每个结点的左右子树交换位置 ```c void swap(BiTree T) { if (!T) return; BiTree tmp = T->lchild; T->lchild = T->rchild; T->rchild = tmp; swap(T->lchild); swap(T->rchild); } ``` 6. 设计双序遍历算法 ```c void doubleOrderTraverse(BiTree T) { if (!T) return; printf("%d ", T->data); doubleOrderTraverse(T->lchild); printf("%d ", T->data); doubleOrderTraverse(T->rchild); } ``` 7. 计算二叉树最大宽度 ```c int getWidth(BiTree T) { if (!T) return 0; Queue Q; initQueue(&Q); enQueue(&Q, T); int max_width = 1; while (!isEmptyQueue(Q)) { int level_len = getSize(Q); max_width = max(max_width, level_len); for (int i = 0; i < level_len; i++) { BiTree p = deQueue(&Q); if (p->lchild) enQueue(&Q, p->lchild); if (p->rchild) enQueue(&Q, p->rchild); } } return max_width; } ``` 8. 求二叉树中第一条最长的路径长度,并输出此路径上各结点 ```c void getLongestPath(BiTree T, int *max_depth, Stack *S, Stack *max_S) { if (!T) return; push(S, T); if (!T->lchild && !T->rchild) { // 到达叶结点 if (S->size > *max_depth) { *max_depth = S->size; copyStack(S, max_S); } } else { getLongestPath(T->lchild, max_depth, S, max_S); getLongestPath(T->rchild, max_depth, S, max_S); } pop(S); } void printStack(Stack *S) { for (int i = 0; i < S->size; i++) { printf("%d ", S->data[i]->data); } } void printLongestPath(BiTree T) { int max_depth = 0; Stack S, max_S; initStack(&S); initStack(&max_S); getLongestPath(T, &max_depth, &S, &max_S); printStack(&max_S); } ```

相关推荐

最新推荐

recommend-type

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

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

安装NumPy教程-详细版

附件是安装NumPy教程_详细版,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!
recommend-type

语音端点检测及其在Matlab中的实现.zip

语音端点检测及其在Matlab中的实现.zip
recommend-type

C#文档打印程序Demo

使用C#完成一般文档的打印,带有页眉,页脚文档打印,表格打印,打印预览等
recommend-type

DirectX修复工具-4-194985.zip

directx修复工具 DirectX修复工具(DirectX repair)是系统DirectX组件修复工具,DirectX修复工具主要是用于检测当前系统的DirectX状态,若发现异常情况就可以马上进行修复,非常快捷,使用效果也非常好。
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

可见光定位LED及其供电硬件具体型号,广角镜头和探测器,实验设计具体流程步骤,

1. 可见光定位LED型号:一般可使用5mm或3mm的普通白色LED,也可以选择专门用于定位的LED,例如OSRAM公司的SFH 4715AS或Vishay公司的VLMU3500-385-120。 2. 供电硬件型号:可以使用常见的直流电源供电,也可以选择专门的LED驱动器,例如Meanwell公司的ELG-75-C或ELG-150-C系列。 3. 广角镜头和探测器型号:一般可采用广角透镜和CMOS摄像头或光电二极管探测器,例如Omron公司的B5W-LA或Murata公司的IRS-B210ST01。 4. 实验设计流程步骤: 1)确定实验目的和研究对象,例如车辆或机器人的定位和导航。
recommend-type

JSBSim Reference Manual

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