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.hqwc.cn/news/206878.html

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

相关文章

利用QRCode.js生成动态二维码页面

文章目录 QRCode.js简介HTML结构JavaScript生成动态二维码拓展功能1. 联系信息二维码2. Wi-Fi网络信息二维码 总结 &#x1f389;利用QRCode.js生成动态二维码页面 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏…

windows系统安装ubuntu22.04虚拟机

镜像文件准备 镜像文件 官网 企业开源和Linux | Ubuntu 镜像下载地址 https://cn.ubuntu.com/download/server/step1 选择合适的版本下载 虚拟机安装 文件-- 新建虚拟机 选择镜像 修改安装路径 修改大小&#xff0c;最好60g&#xff0c;大一点 设置用户信息 设置虚拟机网络…

Python通过selenium调用IE11浏览器报错解决方法

前提 正常安装Python 工具&#xff0c;selenium 包可以正常导入。IE浏览器驱动 IEDriverServer.exe 已经正确放置到已经添加path目录的文件下。 报错现象&#xff1a; 解决方法 打开浏览器进入 internet 选项 切换到安全页签 &#xff0c;去除“应用保护模式” 再次调用验证…

接口自动化中cookies的处理技术

一&#xff0c;理论知识 为什么有cookie和session&#xff1f; 因为http协议是一种无状态的协议&#xff0c;即每次服务端接受到客户端的请求时都时一个全新的请求&#xff0c;服务器并不知道客户端的请求记录&#xff0c;session和cookie主要目的就是弥补http的无状态特性 …

for,while,until语句

一、for循环 读取不同的变量值&#xff0c;用来逐个执行同一组命令&#xff0c;经常使用在已经知道要进行多少次循环的场景。 1、基本格式 for 变量名称(注意是名称&#xff0c;不是变量$等) [ in 名称范围 ] (可以不写)do 执行内容 若满足循环则做什么动作do…

“云浮云福保”暖心回归! 保障升级价格不变,医保个账可为全家缴费!

11月22日&#xff0c;2024年“云浮云福保”项目启动会在广东省云浮市迎宾馆成功举办。记者在会上获悉&#xff0c;“云浮云福保”是在云浮市医疗保障局、云浮市金融工作局、国家金融监督管理总局云浮监管分局指导下&#xff0c;的指导下&#xff0c;由中国人民财产保险股份有限…

怎么提高拍摄视频画质和清晰度?这几个方法一定要学会

一、提高拍摄视频画质和清晰度 1、分辨率 分辨率就是我们常说的480P、720P、1080P、4K等等&#xff0c;分辨率越大&#xff0c;在某种程度上视频也就越清晰。虽然原理是这样的&#xff0c;但在不同平台上传视频也会影响最终的画质。 比如超高分辨率的视频不适合在某音。因为…

Electronica上海 Samtec 验证演示 | FireFly™Micro Flyover System™

摘要/前言 在圆满结束的2023慕尼黑上海电子展上&#xff0c;Samtec虎家团队为观众带来了前所未有的丰富体验&#xff1a;产品展示、采访、Demo演示、抽奖互动~ 尤其是Demo演示&#xff0c;虎家工程师FAE Marcus为大家带来了数个精彩的产品与系统讲解演示。其中更不乏合作伙伴…

算法刷题-动态规划-1

算法刷题-动态规划-1 不同路径不同路径||方法一&#xff1a;方法二 第N个泰波那契数递归写法滚动数组 三步问题递归操作滚动数组 使用最小画法爬楼梯递归 解码方法方法一方法二&#xff1a;&#xff08;大佬讲解&#xff09; 不同路径 //机器人不同的路径进入到指定的地点 publ…

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

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

现代计算与光学的跨界机遇——

时至今日&#xff0c;互补氧化金属半导体&#xff08;CMOS&#xff09;技术的飞速发展促进了集成电路的空前成功。 晶体管的创新与时俱进 正如戈登-E-摩尔&#xff08;Gordon E. Moors&#xff09;在1965年预测的那样&#xff0c;每隔18-24个月&#xff0c;计算芯片上的晶体管数…

如何保持口腔健康?羊大师全面指南!

口腔健康对于我们的整体健康至关重要。保持口腔健康可以帮助我们避免口腔疾病&#xff0c;如龋齿、牙周疾病等。口腔健康与身体其他部分的健康也有很大的关系。我们应该如何保持口腔健康呢&#xff1f;在本文中&#xff0c;小编羊大师将为您提供全面指南&#xff0c;详细介绍如…