909-2015-T3

文章目录

  • 1.原题
  • 2.算法思想
    • 2.1.求树的高度
    • 2.2.求路径
  • 3.关键代码
  • 4.完整代码
  • 5.输出结果

1.原题

试编写算法,求给定二叉树上从根节点到叶子节点的一条路径长度等于树的深度减一的路径(即列出从根节点到该叶子节点的节点序列),若这样的路径存在多条,则输出路径终点在“最左”的一条。

2.算法思想

计算出树的高度,然后再进行类前序遍历,输出路径为最深的、最靠左的一条。分为两部分。1.求树的高度;2.求路径

2.1.求树的高度

这个算法在14年某个题已经涉及到了。通过遍历的方式得出每一个结点的左子树高度和右子树高度,而该结点的高度就是左子树高度和右子树高度较大的那一个+1

2.2.求路径

由于是求最靠左的一条、最深的一条路径,那么用类先序遍历的方式进行探索最有优势。根据先序遍历的特点,我们第一次找到的路径即为最左边的。同时引入了一个变量isFound,这样在找到一条路径之后可以更快跳过后续的递归嵌套。

3.关键代码

/*** @struct treeNode* @brief 二叉树节点的结构体*/
struct treeNode {int data; /**< 节点存储的数据 */struct treeNode *lchild; /**< 左子节点指针 */struct treeNode *rchild; /**< 右子节点指针 */
};/*** @brief 计算二叉树的高度。** 通过递归地计算左右子树的高度,返回树的高度。** @param root 二叉树根节点指针。* @return 返回二叉树的高度。*/
int treeHeight(struct treeNode *root) {if (root == NULL) {return 0; // 如果根节点为空,返回0表示树的高度为0} else {int leftHeight = treeHeight(root->lchild); // 递归计算左子树的高度int rightHeight = treeHeight(root->rchild); // 递归计算右子树的高度// 返回左右子树中较大的高度加上当前节点的高度(加1)return (leftHeight > rightHeight) ? leftHeight + 1 : rightHeight + 1;}
}/*** @brief 在二叉树中查找具有特定深度的路径** 通过递归遍历二叉树,查找根到叶子节点的路径,其深度等于指定高度,并打印该路径。** @param root 二叉树根节点指针。* @param isFound 指向一个布尔值的指针,用于判断是否已找到特定深度的路径。* @param height 期望的路径深度。* @param depth 当前递归深度。* @param path 用于存储路径节点值的数组。*/
void findPath(struct treeNode *root, bool *isFound, int height, int depth, int path[]) {if (root == NULL || (*isFound) == true) {return; // 如果根节点为空或已找到路径,则直接返回}path[depth] = root->data; // 将当前节点值存入路径数组中if (depth == height - 1) {(*isFound) = true; // 标记已找到路径for (int i = 0; i < height; i++) {printf("%d ", path[i]); // 打印路径节点值}printf("\n");return;} else {depth += 1; // 增加深度findPath(root->lchild, isFound, height, depth, path); // 递归遍历左子树findPath(root->rchild, isFound, height, depth, path); // 递归遍历右子树}
}/*** @brief 寻找二叉树中指定深度的路径** 通过计算二叉树的高度,创建对应高度的数组,并在树中查找深度为高度减一的路径。* 找到后打印该路径上的节点值。** @param root 二叉树根节点指针。*/
void findSpecialPath(struct treeNode *root) {int height = treeHeight(root); // 计算二叉树的高度int path[height]; // 创建与高度相同大小的数组,用于存储路径节点值bool isFound = false; // 指示是否找到特定深度的路径findPath(root, &isFound, height, 0, path); // 查找特定深度的路径
}

4.完整代码

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>/*** @struct treeNode* @brief 二叉树节点的结构体*/
struct treeNode {int data; /**< 节点存储的数据 */struct treeNode *lchild; /**< 左子节点指针 */struct treeNode *rchild; /**< 右子节点指针 */
};/*** @brief 计算二叉树的高度。** 通过递归地计算左右子树的高度,返回树的高度。** @param root 二叉树根节点指针。* @return 返回二叉树的高度。*/
int treeHeight(struct treeNode *root) {if (root == NULL) {return 0; // 如果根节点为空,返回0表示树的高度为0} else {int leftHeight = treeHeight(root->lchild); // 递归计算左子树的高度int rightHeight = treeHeight(root->rchild); // 递归计算右子树的高度// 返回左右子树中较大的高度加上当前节点的高度(加1)return (leftHeight > rightHeight) ? leftHeight + 1 : rightHeight + 1;}
}/*** @brief 在二叉树中查找具有特定深度的路径** 通过递归遍历二叉树,查找根到叶子节点的路径,其深度等于指定高度,并打印该路径。** @param root 二叉树根节点指针。* @param isFound 指向一个布尔值的指针,用于判断是否已找到特定深度的路径。* @param height 期望的路径深度。* @param depth 当前递归深度。* @param path 用于存储路径节点值的数组。*/
void findPath(struct treeNode *root, bool *isFound, int height, int depth, int path[]) {if (root == NULL || (*isFound) == true) {return; // 如果根节点为空或已找到路径,则直接返回}path[depth] = root->data; // 将当前节点值存入路径数组中if (depth == height - 1) {(*isFound) = true; // 标记已找到路径for (int i = 0; i < height; i++) {printf("%d ", path[i]); // 打印路径节点值}printf("\n");return;} else {depth += 1; // 增加深度findPath(root->lchild, isFound, height, depth, path); // 递归遍历左子树findPath(root->rchild, isFound, height, depth, path); // 递归遍历右子树}
}/*** @brief 寻找二叉树中指定深度的路径** 通过计算二叉树的高度,创建对应高度的数组,并在树中查找深度为高度减一的路径。* 找到后打印该路径上的节点值。** @param root 二叉树根节点指针。*/
void findSpecialPath(struct treeNode *root) {int height = treeHeight(root); // 计算二叉树的高度int path[height]; // 创建与高度相同大小的数组,用于存储路径节点值bool isFound = false; // 指示是否找到特定深度的路径findPath(root, &isFound, height, 0, path); // 查找特定深度的路径
}/*** @brief 创建新的二叉树节点。** @param data 新节点存储的数据。* @return 指向新节点的指针。*/
struct treeNode *createNode(int data) {struct treeNode *newNode = (struct treeNode *) malloc(sizeof(struct treeNode));newNode->data = data;newNode->lchild = NULL;newNode->rchild = NULL;return newNode;
}/*** @brief 以括号表示法打印二叉树。** @param root 二叉树根节点指针。*/
void printBinaryTree(struct treeNode *root) {if (root == NULL) {return;}printf("(%d", root->data);if (root->lchild != NULL || root->rchild != NULL) {printf(" ");if (root->lchild == NULL) {printf("( )");} else {printBinaryTree(root->lchild);}printf(" ");if (root->rchild == NULL) {printf("( )");} else {printBinaryTree(root->rchild);}}printf(")");
}/*** @brief 以树的结构方式打印二叉树。** @param root 二叉树根节点指针。* @param space 节点之间的间距。*/
void printTreeStructure(struct treeNode *root, int space) {if (root == NULL) {return;}int count = 5; // 调整节点之间的间距printTreeStructure(root->rchild, space + count);for (int i = 0; i < space; i++) {printf(" ");}printf("%d\n", root->data);printTreeStructure(root->lchild, space + count);
}int main() {struct treeNode *root = createNode(10);  // 根节点为10root->lchild = createNode(5);root->rchild = createNode(15);root->lchild->lchild = createNode(3);root->rchild->lchild = createNode(12);root->rchild->rchild = createNode(18);root->rchild->lchild->rchild = createNode(13);root->rchild->rchild->rchild = createNode(9);// 以括号表示法打印二叉树printf("Binary Tree Structure (Parenthesis Representation):\n");printBinaryTree(root);// 以树的结构方式打印二叉树printf("\nBinary Tree Structure:\n");printTreeStructure(root, 0);int height = treeHeight(root);printf("Height of the tree: %d\n", height);// 寻找特定路径并打印printf("Special Path with length equal to tree depth - 1: \n");findSpecialPath(root);return 0;
}

5.输出结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库常见错误及解决方案

“时记数据安全,共享优质资源”,数据库安全是指数据库数据的完整、真实、可靠和可用性。数据库也是一种软件系统,与其他软件系统一样也需要保护,需要采取一定的技术和一定的安全管理策略,保证数据库中的数据不被泄漏、不被破坏、不被修改或删除。本文列举MySQL数据库常见错…

“index“ should always be multi-word

vue报错&#xff1a;Component name “index” should always be multi-word 分析&#xff1a;组件名要以驼峰格式命名&#xff0c;自定义的要以loginIndex.vue等这种方式命名&#xff0c;防止和html标签冲突&#xff0c;所以命名index.vue 会报错 解决&#xff1a;在.eslint…

性能测试:系统架构性能优化思路

今天谈下业务系统性能问题分析诊断和性能优化方面的内容。这篇文章重点还是谈已经上线的业务系统后续出现性能问题后的问题诊断和优化重点。 系统性能问题分析流程 我们首先来分析下如果一个业务系统上线前没有性能问题&#xff0c;而在上线后出现了比较严重的性能问题&#x…

RTS 客户端-服务器网络

Stone Monarch 从一开始就支持多人游戏&#xff0c;但随着时间的推移&#xff0c;网络模型经历了多次迭代。我最初基于这篇著名的帝国时代文章实现了点对点锁步模型。 点对点锁定步骤有一些众所周知的问题。点对点方面使玩家很难相互连接&#xff0c;并增加了每个新玩家的网络…

【无标题】dp80采集机和机器人通信相关框架总结

采血机器人通信解析相关框架总结: 类似于dp80,将整个过程进行了分解如下: 类似于dp80,将整个过程进行了分解如下: 上位机界面在进行点击操作的时候,先是通信协议的解析,解析后改变采血的控制状态如下: Dp80主要框架解析࿱

华为obs上传下载-Java版 2023-11-23

弄了半天&#xff0c;老师帮弄成功了&#xff0c;经过同意&#xff0c;分享到网上&#xff0c;希望能帮助更多人&#xff0c;至于怎么弄的&#xff0c;我也不知道。 创建idea项目后&#xff0c;项目结构&#xff0c;对应文件没有的创一个 pom.xm 注意改Java版本&#xff0c;我…

dvwa-command injection 代码审计(超详细逐行审计)

dvwa-command injection 代码审计 low <?phpif( isset( $_POST[ Submit ] ) ) {// Get input$target $_REQUEST[ ip ];// Determine OS and execute the ping command.if( stristr( php_uname( s ), Windows NT ) ) {// Windows$cmd shell_exec( ping . $target );}…

AMESim|Make failed:Unable to create an excutable for the system

最近在AMESIM与MATLAB进行联合仿真的时候遇到如下问题&#xff1a; Make failed:Unable to create an excutable for the system. 看了网上的解决办法如下 配置环境变量重装AMESIM&#xff0c;有顺序要求&#xff0c;首先是VS&#xff0c;然后是AMESIM与MATLAB。在AMESIM安装…

csdn最新最全pytest系列——pluggy插件源码解读(一)HookspecMarker类和HookimplMarker类分析

简介 pluggy是一个非常优秀的插件系统&#xff0c;它是理解pytest的核心&#xff0c;只有理解了pluggy的原理&#xff0c;才能更好的理解和使用pytest&#xff0c;否则见到了pytest的很多应用都会感觉很难理解 pluggy插件总共的代码量不足一千行&#xff0c;而实现的功能却是…

IDEA 配置maven结合案例使用篇

1. 项目需求和结构分析 需求案例&#xff1a;搭建一个电商平台项目&#xff0c;该平台包括用户服务、订单服务、通用工具模块等。 项目架构&#xff1a; 用户服务&#xff1a;负责处理用户相关的逻辑&#xff0c;例如用户信息的管理、用户注册、登录等。 spring-context 6.0.…

5-2计算pi

#include<stdio.h> #include<math.h>int main(){int sign1;//数值的符号int count0;//累计计算循环的次数double pi0.0;double n1;//分母double term1.0;//当前项的数while(fabs(term)>1e-6){//fabs(trem)|term|pipiterm;nn2;sign-sign;termsign/n;count;}pipi*…

基于Vue3的低代码开发平台——JNPF

目录 一、什么是Vue.js &#xff1f; 二、Jnpf-Web-Vue3 的技术栈介绍 &#xff08;1&#xff09;Vue3.x &#xff08;2&#xff09;Vue-router4.x &#xff08;3&#xff09;Vite4.x &#xff08;4&#xff09;Ant-Design-Vue3.x &#xff08;5&#xff09;TypeScript &#x…

【Java】实现阻塞队列-生产者/消费者模型

上文中我们讲了Java库中自带的阻塞队列&#xff0c;并且讲了如何用阻塞队列来实现生产者消费者模型 【Java】用Java库中自带的阻塞队列以及用阻塞队列实现生产者-消费者模型 下面我们来讲如何用代码实现一个阻塞队列 1、实现一个阻塞队列 阻塞队列 普通队列 线程安全 阻…

机器学习实战第1天:鸢尾花分类任务

专栏介绍 欢迎订阅专栏——机器学习实战 机器学习实战_Nowl的博客-CSDN博客 纸上得来终觉浅 本专栏项目将着重于解决各类实际机器学习问题&#xff0c;带你上手各种场景的实际问题 数据集可以在我的资源中找到&#xff0c;也可以自行搜索 文中导入数据集的路径要改成自己的…

C++学习笔记——C++ deque和vector的区别

C中的std::deque&#xff08;双端队列&#xff09;和std::vector&#xff08;向量&#xff09;是两种不同的容器类型&#xff0c;它们有以下区别&#xff1a; 内部实现方式不同&#xff1a;std::deque使用了一种双端队列的数据结构&#xff0c;它由多个块&#xff08;chunks&am…

【操作系统】文件系统的实现

文章目录 文件系统的层次结构文件系统的实现目录实现线性列表哈希表 文件的实现连续分配链接分配索引分配 文件存储空间管理空闲表法与空闲链表法成组链接法位示图法 文件系统的层次结构 文件系统从上往下分为了五层&#xff0c;分别是用户调用接口、文件目录系统、存取控制模…

SWT/Jface(1): 表格的创建和渲染

前言 使用JFace创建表格还是比较方便的, 如果仅仅是创建空表格的话, 以下2步即可完成: 创建TableViewer对象, 指定样式, 比如是否支持多行选择, 有无边框, 是否支持滚动条等创建TableColumn对象: 包括列展示名称, 宽度和样式等, 最终绑定到table对象 实例 创建表格 //注意…

设计模式-学习总结

学习总结 本文仅供自我学习使用 我是一个小白设计模式一.创建型模式1.单例模式(1).饿汉式(2).懒汉式&#xff0c;双检锁(3).静态内部类(4).枚举 2.原型模式3.工厂模式(1).简单工厂模式 4.抽象工厂模式5.建造者模式 二.结构型模式6.适配器模式7.组合模式8.装饰器模式9.外观模式1…

【AI】行业消息精选和分析(11月22日)

今日动态 &#x1f453; Video-LLaVA&#xff1a;视觉语言模型革新&#xff1a; - 图像和视频信息转换为文字格式。 - 多模态理解能力&#xff0c;适用于自动问答系统等。 &#x1f4c8; 百度文心一言用户数达7000万&#xff1a; &#x1f50a; RealtimeTTS&#xff1a;实时文本…

SpringBoot : ch06 整合 web (一)

前言 SpringBoot作为一款优秀的框架&#xff0c;不仅提供了快速开发的能力&#xff0c;同时也提供了丰富的文档和示例&#xff0c;让开发者更加容易上手。在本博客中&#xff0c;我们将介绍如何使用SpringBoot来整合Web应用程序的相关技术&#xff0c;并通过实例代码来演示如何…