863. 二叉树中所有距离为 K 的结点

863. 二叉树中所有距离为 K 的结点

在这里插入图片描述


C代码:dfs

/*** struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/typedef struct {int key;struct TreeNode* node;UT_hash_handle hh;
} HashTable;HashTable* head;
int* ans;
int ansSize;void addToHash(int ikey, struct TreeNode* node) {HashTable* out = NULL;HASH_FIND_INT(head, &ikey, out); // 去找当前值的父节点if (out == NULL) {out = (HashTable*)malloc(sizeof(HashTable));out->key = ikey;out->node = node;  // 保存当前节点的父节点HASH_ADD_INT(head, key, out);} else {out->node = node;}
}void findParents(struct TreeNode* root) {if (root->left != NULL) {addToHash(root->left->val, root);findParents(root->left);}if (root->right != NULL) {addToHash(root->right->val, root);findParents(root->right);}
}struct TreeNode* query(int ikey) {HashTable* out = NULL;HASH_FIND_INT(head, &ikey, out);if (out == NULL) {return NULL;}return out->node;
}// 从target节点往3个方向搜索,确保3个方向的途经点不能再dfs回去!
void findAns(struct TreeNode* node, struct TreeNode* from, int depth, int k) {if (node == NULL) {return;}if (depth == k) {  // 前序处理ans[ansSize++] = node->val;return;}if (node->left != from) {  // 搜索左右子节点,from是途径过的上一个结点findAns(node->left, node, depth + 1, k);}if (node->right != from) {findAns(node->right, node, depth + 1, k);}if (query(node->val) != from) {  // 顺着父节点往上搜索,node的父节点不等于fromfindAns(query(node->val), node, depth + 1, k);}
}int* distanceK(struct TreeNode* root, struct TreeNode* target, int k, int* returnSize) {head = NULL;                      // target是个结点ans = (int*)malloc(sizeof(int) * 500);ansSize = 0;findParents(root);  // 从root出发 DFS,记录每个结点的父结点findAns(target, NULL, 0, k); // 从target出发 DFS,寻找所有深度为 k 的结点*returnSize = ansSize;return ans;
}

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

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

相关文章

LeetCode 1658. 将 x 减到 0 的最小操作数

题目链接 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目解析 有种说法叫做,正难则反。我们直接去按照题目意思去求很难去理解与操作,但是我们换种思想就会简单许多。我们让整个数组的和减去x得到一个target&#xff0c…

使用Caffeine实现帖子的缓存来优化网站的运行速度

导入依赖 <!-- https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeine --><dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.7</version>…

Vue + Element UI 前端篇(八):管理应用状态

使用 Vuex 管理应用状态 1. 引入背景 像先前我们是有导航菜单栏收缩和展开功能的&#xff0c;但是因为组件封装的原因&#xff0c;隐藏按钮在头部组件&#xff0c;而导航菜单在导航菜单组件&#xff0c;这样就涉及到了组件收缩状态的共享问题。收缩展开按钮触发收缩状态的修改…

【C++ 学习 ⑳】- 详解二叉搜索树

目录 一、概念 二、实现 2.1 - BST.h 2.2 - test.cpp 三、应用 四、性能分析 一、概念 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;&#xff0c;又称二叉排序树或二叉查找树。 二叉搜索树是一棵二叉树&#xff0c;可以为空&#xff1b;如果不…

MATLAB基础-MAT文件的读写操作

简介 MAT文件是MATLAB格式的双精度二进制数据文件&#xff0c;由MATLAB软件创建&#xff0c;可以使用MATLAB软件再其他计算机上以其他浮点格式读取&#xff0c;同时也可以使用其他软件通过MATLAB的应用程序接口来进行读写操作。如果只是再MATLAB环境中处理数据&#xff0c;使用…

c++通过tensorRT调用模型进行推理

模型来源&#xff1a; 算法工程师训练得到的onnx模型 c对模型的转换&#xff1a; 拿到onnx模型后&#xff0c;通过tensorRT将onnx模型转换为对应的engine模型&#xff0c;注意&#xff1a;训练用的tensorRT版本和c调用的tensorRT版本必须一致。 如何转换&#xff1a; 算法工…

【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码

【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码 1 题目 题目 D 题 圈养湖羊的空间利用率 规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养&#xff0c;适应不同种类、不同阶段的牲畜对空间的不同要求&#xff0c;以保障牲畜安全和健康&a…

linux-进程-execl族函数

exec函数的作用&#xff1a; 我们用fork函数创建新进程后&#xff0c;经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时&#xff0c;该进程被完全替换为新程序。因为调用exec函数并不创建新进程&#xff0c;所以前后进程的ID并没有改变。 简单来说就是&…

SpringBoot粗浅分析

应用分析 1、依赖管理机制 在springBoot项目中&#xff0c;导入starter-web所有想换依赖都会被导入&#xff0c;甚至不用去规定它们的版本号。它是根据Maven的依赖传递原则来设置&#xff0c;只需要导入场景启动器&#xff0c;场景启动器自动把这个场景的所有核心依赖全部导入…

广东成人高考报名将于9月14日开始!

截图来自广东省教育考试院官网* 今年的广东成人高考正式报名时间终于确定了&#xff01; 报名时间&#xff1a;2023年 9 月14—20日 准考证打印时间&#xff1a;考前一周左右 考试时间&#xff1a;2023年10月21—22日 录取时间&#xff1a;2023年12 月中上旬 报名条件: …

Android 状态栏显示运营商名称

Android 原生设计中在锁屏界面会显示运营商名称&#xff0c;用户界面中&#xff0c;大概是基于 icon 数量长度显示考虑&#xff0c;对运营商名称不作显示。但是国内基本都加上运营商名称。对图标显示长度优化基本都是&#xff1a;缩小运营商字体、限制字数长度、信号图标压缩上…

FPGA实战小项目2

基于FPGA的贪吃蛇游戏 基于FPGA的贪吃蛇游戏 基于fpga的数字密码锁ego1 基于fpga的数字密码锁ego1 基于fpga的数字时钟 basys3 基于fpga的数字时钟 basys3