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

news/2024/7/20 20:51:01 标签: 深度优先, 算法

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的父节点不等于from
        findAns(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.niftyadmin.cn/n/5009280.html

相关文章

WebRTC中 setup:actpass、active、passive

1、先看一下整个DTLS的流程 setup:actpass、active、passive就发生在Offer sdp和Anser SDP中 Offer的SDP是setup:actpass,这个是服务方: v0\r o- 1478416022679383738 2 IN IP4 127.0.0.1\r s-\r t0 0\r agroup:BUNDLE 0 1\r aextmap-allow-mixed\r amsid-semanti…

Linux安装nginx教程

目录 一、Nginx下载 二、安装步骤 1、在 /docker目录下新建 nginx 文件夹 2、将解压包移动到nginx目录下并解压到nginx目录 3、进入 nginx目录,找到 configure 4、运行 configure,命令 5、安装 6、查看根目录 7、进入Nginx目录下的conf文件夹…

【2023年数学建模国赛】赛题发布

2023数学建模国赛赛题已经发布啦,距离赛题发布已经过去三个小时了,大家是否已经确定题目呢?学姐后续会持续更新赛题思路与代码~

MySQL视图用户管理

文章目录 视图视图的规则用户用户信息创建用户删除用户修改密码 用户权限给用户授权回收权限 视图 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会…

目标检测笔记(十三): 使用YOLOv5-7.0版本对图像进行目标检测完整版(从自定义数据集到测试验证的完整流程))

文章目录 一、目标检测介绍二、YOLOv5介绍2.1 和以往版本的区别三、代码获取3.1 视频代码介绍四、环境搭建五、数据集准备5.1 数据集转换5.2 数据集验证六、模型训练七、模型验证八、模型测试九、评价指标一、目标检测介绍 目标检测(Object Detection)是计算机视觉领域的一个…

深度学习(十一)---zed 调用yolov5 进行识别目标并实时测距

1. 前言 zed 相机测距有2种方式:一种是根据点云数据进行测试,二是根据zed获取深度值进行测距。上篇文章 调用yolov5模型进行实时图像推理及网页端部署 我们讲述了zed调用yolov5进行目标识别,我们在此基础上进一步实现目标测距功能。 2.深度…

RabbitMQ: SpringBoot 整合 RabbitMQ

一、生产者模块 1.导入依赖 重点是这个依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> <properties><maven.compiler.source>8</maven.…

Chrome 108版(64-bit 108.0.5359.125)网盘下载

还在用Selenium的朋友们注意了&#xff0c;目前Chrome的最新版是116&#xff0c;而官方的Chromedriver只支持到115版。 可惜Google不提供旧版Chrome的下载方式&#xff0c;需要旧版的很难回去了。如果真的想要旧版的Chrome&#xff0c;只能民间自救。 我在2022年12月备份了C盘…