首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C中使用递归DFS返回节点本身

在C语言中,使用递归的深度优先搜索(DFS)算法返回节点本身,可以通过以下代码实现:

代码语言:txt
复制
#include <stdio.h>

// 定义节点结构
struct Node {
    int data;
    struct Node* left;
    struct Node* right;
};

// 创建新节点
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    if (newNode == NULL) {
        printf("内存分配失败\n");
        exit(1);
    }
    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

// 递归DFS返回节点本身
struct Node* dfs(struct Node* node, int target) {
    if (node == NULL) {
        return NULL;
    }
    if (node->data == target) {
        return node;
    }
    struct Node* leftResult = dfs(node->left, target);
    if (leftResult != NULL) {
        return leftResult;
    }
    struct Node* rightResult = dfs(node->right, target);
    if (rightResult != NULL) {
        return rightResult;
    }
    return NULL;
}

int main() {
    // 构建二叉树
    struct Node* root = createNode(1);
    root->left = createNode(2);
    root->right = createNode(3);
    root->left->left = createNode(4);
    root->left->right = createNode(5);
    root->right->left = createNode(6);
    root->right->right = createNode(7);

    // 在二叉树中查找节点值为5的节点
    struct Node* result = dfs(root, 5);
    if (result != NULL) {
        printf("找到了节点 %d\n", result->data);
    } else {
        printf("未找到目标节点\n");
    }

    return 0;
}

这段代码中,我们定义了一个二叉树的节点结构,并实现了创建新节点的函数。然后,我们定义了递归的深度优先搜索函数dfs(),该函数接收一个节点和目标值作为参数,返回找到的节点指针或NULL。

dfs()函数中,首先检查当前节点是否为NULL,如果是则返回NULL。然后,检查当前节点的值是否等于目标值,如果是则返回当前节点指针。如果不是,则递归调用dfs()函数分别在左子树和右子树中搜索目标节点。如果左子树中找到了目标节点,返回左子树中的结果;如果右子树中找到了目标节点,返回右子树中的结果。如果左右子树中都未找到目标节点,返回NULL。

最后,在main()函数中创建一个二叉树,并调用dfs()函数查找值为5的节点。如果找到了节点,输出节点值;否则输出未找到目标节点的消息。

这种递归的深度优先搜索算法在树、图等数据结构中广泛应用,用于查找特定节点或遍历整个结构。腾讯云提供了丰富的云计算产品,例如云服务器、云数据库、云存储等,可以根据具体需求选择合适的产品来支持开发和部署。你可以访问腾讯云官网获取更详细的产品介绍和使用说明:腾讯云官网

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c++中this指针的使用,其实就是指类本身

c++中this指针的使用,其实就是指类本身 #include using namespace std; class Aa { public: int a,s;...void fuzhi(int r,int t){ this ->a=r;//使用a=r,可以达到同样 的效果 this ->s=t;//使用s=t,可以达到同样...endl; cout <<s<<endl; } }sss; int main(void) { sss.fuzhi(1,2); return 0; } 代码中的...this就是指的Aa类本身,这个例子只是简单的理解this的作用,和java中指代类是一个作用的,但是java涉及到单继承类,多继承接口,这些同样是可以用this指代的,最重要的是注意this的范围,也就是作用域...,这点在编写大型程序的时候会显得很重要,作用域指代返回过大,会报null或者其他很少见的错误,这个要格外注意。

6910

如何使用LinkFinder在JavaScript文件中查找网络节点

关于LinkFinder LinkFinder是一款功能强大的Python脚本,在该工具的帮助下,广大研究人员可以轻松在JavaScript文件中发现和扫描网络节点及其相关参数。...这样一来,渗透测试人员和漏洞猎人将能够快速在测试的目标网站伤收集新的隐藏节点了。...,例如'/*.js' -o --output 将输出结果打印到STDOUT,默认会将结果存储到HTML文件中,例如output.html -r --regex 使用正则表达式过滤节点,例如^/api/...-d --domain 在分析整个域时使用,可以切换并枚举所有找到的JS文件 -b --burp 当Burp结果文件中包含多个JS文件时,可以切换使用 -c --cookies 向请求中添加Cookie...-h --help 显示工具帮助信息和退出 工具运行样例 在线上JavaScript文件中查找网络节点,并将结果输出到results.html文件中: python linkfinder.py

44350
  • C++中fstream_在使用中

    C++中处理文件类似于处理标准输入和标准输出。类ifstream、ofstream和fstream分别从类 istream、ostream和iostream派生而来。...作为派生的类,它们继承了插入和提取运算符(以及其他成员函数),还有与文件一起使用的成员和构造函数。可将文件 包括进来以使用任何fstream。...如果只执行输入,使用ifstream类;如果只执行输出,使用 ofstream类;如果要对流执行输入和输出,使用fstream类。可以将文件名称用作构造函数参数。...被打开的文件在程序中由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。...http://www.cplusplus.com/reference/fstream/fstream/中列出了fstream中可以使用的成员函数。

    5.5K10

    【数据结构与算法】递归全流程详细剖析 | 详解图的深度优先遍历

    并使用递归的方式来完成数据结构图的深度优先遍历 个人主页: 大数据小禅 图的遍历与递归 1. 递归初体验 1.1 使用递归实现阶乘操作 2....递归初体验 ---- 什么是递归 递归就是一个程序或者是函数在调用自身的一种方法。 这一种方法通常是把一个复杂的问题经过层层的转化为跟原问题相似但规模较小的问题来求解。...一般来说递归需要边界条件,递归前进段和递归返回段,当边界条件不满足的时候,递归前进,当边界条件满足的时候就递归返回。...递归调用详解 2.1 普通的函数递归调用过程 步骤1:函数A执行,调用函数B,这个时候A函数暂时挂起,函数B调用函数C,B暂时挂起 步骤2:函数C执行完之后,就回到B函数调用C函数的地方,去执行C函数调用后...,去执行调用的本身的函数。

    87130

    递归专题BFS

    深度优先搜索(BFS):可以使用DFS的标志一般是决策树,二叉树,单支树等;这个算法其实还是暴力枚举,只不过是使用递归简化了代码;他的时间复杂度仍然是很大,一般对速度有要求的题,使用DFS就会溢出; 深度优先遍历其实就是...;因为在不同的情况中可能会调用相同的DFS函数,将数据储存起来就会减少堆栈压力,从而提高代码效率; 第二步,信任(相信我的递归黑盒子可以帮我完成任务) 1.不要特别的在意递归的每个过程细节,我们只要宏观的把他当做一个黑盒子...,那么重点来了;递归就是自己调用自己;说明DFS中里面肯定还要调用DFS,对吧;这时候在结合我上面说的"做好当下的任务";我在我这一层函数中我肯定要调用后面的一层函数呗,他怎么做我不管,我只要干好我现在的活就行了...的函数头使用;只需要给两个链表参数,然后dfs返回合并后的链表头指针; 好了,现在我们dfs函数的指令就是"你给我返回两个参数链表的合并后的头节点指针",那我们在自己这一层函数要做的就是确定返回谁和谁合并的问题...,然后我们需要把head的节点和head->next节点的调整一下; 最后的出口就是只剩下一个节点,或者如果链表本身就是空的,直接返回head即可; 代码实现 class Solution { public

    7500

    【算法专题】二叉树中的深搜(DFS)

    因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。...在递归结束时,根节点需要返回的值也就被更新为了整棵树的数字和。 代码如下: /** * Definition for a binary tree node....返回移除了所有不包含 1 的子树的原二叉树。 节点 node 的子树为 node 本身加上所有 node 的后代。...递归具体实现方法如下: 如果当前节点不为空,就将当前节点的值加入路径 str 中,否则直接返回; 判断当前节点是否为叶子节点,如果是,则将当前路径加入到所有路径的存储数组 ret 中; 否则,将当前节点值加上...返回结果数组 注意:我们可以只使用一个字符串存储每个状态的字符串,在递归回溯的过程中,需要将路径中的当前节点移除,以回到上一个节点。

    27510

    【算法题解】 Day6 BFS | DFS

    其实,这道题可以使用计数代替栈,进行匹配时每次都取距离当前位置最近的括号,就可以确保平衡。 从左到右遍历字符串,在遍历过程中维护左括号的个数以及添加次数。 如果遇到左括号,则将左括号的个数加 1。...N 叉树的前序遍历 难度:easy 给定一个 n 叉树的根节点  root ,返回 其节点值的 前序遍历 。...n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。...,每次递归时,先访问根节点,然后依次递归访问每个孩子节点即可。...在前序遍历中,我们会先遍历节点本身,然后从左向右依次先序遍历该每个以子节点为根的子树。

    22230

    文心一言 VS 讯飞星火 VS chatgpt (313)-- 算法导论22.3 4题

    文心一言: 要证明在深度优先搜索(DFS)中,使用单个位(通常是布尔值)来标记每个节点的颜色(已访问或未访问)已经足够,并且删除DFS算法中用于标记节点为“灰色”(即,在递归栈中但尚未完成其所有子节点的访问...递归调用本身就会阻止对任何子节点的重复访问,直到当前节点的所有子节点都被探索完毕。...在DFS算法中,第8行通常是将结点标记为黑色,即: 8. color[v] = BLACK 这一步发生在递归调用DFS-VISIT返回后,意味着结点及其所有子节点的访问都已完成。...递归性质:在DFS中,当一个节点的所有子节点都被访问后,控制流会返回到该节点的调用者。这意味着在所有子节点的DFS调用返回后,当前节点的调用也会返回,将控制权交给上一层的调用。 3....这是因为递归的自然结束确保了节点的状态在算法的控制流中得到正确管理。 chatgpt: 在证明"使用单个位来存放每个结点的颜色已经足够"之前,首先需要理解DFS算法和节点颜色的含义。

    9320

    【递归】——五道经典链表与递归问题的深度解析

    面试题08.06.汉诺塔问题 解题思路: 我们可以使用递归的方法将问题分解为更小的子问题。...移动 n-1 个盘子到目标柱子:将之前移动到辅助柱子(b)的 n-1 个盘子移动到目标柱子(c),使用源柱子(a)作为辅助。...l1 } else { // 将l2的当前节点连接到合并结果中,并递归合并l1和l2的下一个节点 l2->...在返回的过程中,将当前节点的 next 指针指向自己,形成反转的链接。 将当前节点的 next 指针设置为 nullptr,使其成为新的链表尾部。...在 Pow 函数中,首先处理基本情况:如果 n 为 0,返回 1(任何数的 0 次方为 1)。 分治法: 使用递归将问题分解: 计算 x 的 n / 2 次方,保存结果为 tmp。

    7310

    前端工程师leetcode算法面试必备-二叉树深度广度遍历

    上一篇中也提到可以采用尾递归的书写方式,让 JavaScript 引擎去将递归优化成迭代,从而解决性能上的问题。 但是在一些情况下,尾递归并没有那么好写,所以本文会同时给出递归和迭代的解决方案。   ...接下来,通过具体的题目解析,带大家了解 DFS 和 BFS 搜索思想在二叉树中的应用。 二、102. 二叉树的层次遍历 给定一个二叉树,返回其按层次遍历的节点值。(即逐层地,从左到右访问所有节点)。...图片 2、DFS   采用 DFS 搜索思想,需要注意在递归的过程中记录当前节点的层次信息: 图片 参考视频:传送门 三、145. 二叉树的后序遍历 给定一个二叉树,返回它的 后序 遍历。   ...DFS 不太容易理解,主要由于迭代不能像递归那样向上回溯,所以迭代向下遍历的过程中,无法保证根节点最后访问。   ...在递归的过程中需要向下传递坐标信息,并且通过 HashTable 记录各个节点的三元组信息( x 坐标、y 坐标,节点值),以便后续构造垂序序列: 图片   得到坐标之后,需要对三元组进行综合排序,最后再根据

    36620

    【愚公系列】2023年12月 五大常用算法(一)-分治算法

    对于大问题,每次递归的过程中需要重复计算很多数据,如果能够将这些数据缓存下来,在后续递归的过程中直接使用,就可以减少重复计算,提高算法效率。...最后,分治算法还可以使用递归算法进行优化。由于分治算法本身就是递归地解决子问题,因此可以利用递归算法的特性来简化代码,使代码更加清晰易懂,并且可以降低算法的复杂度。...分治算法在并行计算中具有很好的优化潜力,可以通过多种技术来提高并行计算的效率和速度。...求解逆序对:将数组划分为两个部分,递归计算每个部分的逆序对数,然后考虑跨越两个部分的逆序对数。可以使用归并排序的思想来实现。在归并的时候,统计两个有序子数组之间的逆序对数,将逆序对数加到最终结果中。...对于左右两个子问题,我们可以将左半部分的序列的中间节点作为根节点,右半部分的序列的中间节点作为其右孩子节点,然后递归地构建左子树和右子树。 返回结果:返回构建好的二叉树。

    30222

    前端工程师leetcode算法面试必备-二叉树深度广度遍历1

    上一篇中也提到可以采用尾递归的书写方式,让 JavaScript 引擎去将递归优化成迭代,从而解决性能上的问题。但是在一些情况下,尾递归并没有那么好写,所以本文会同时给出递归和迭代的解决方案。  ...接下来,通过具体的题目解析,带大家了解 DFS 和 BFS 搜索思想在二叉树中的应用。二、102. 二叉树的层次遍历给定一个二叉树,返回其按层次遍历的节点值。(即逐层地,从左到右访问所有节点)。...图片2、DFS  采用 DFS 搜索思想,需要注意在递归的过程中记录当前节点的层次信息:图片三、145. 二叉树的后序遍历给定一个二叉树,返回它的 后序 遍历。  ...本道题目采用迭代实现 DFS 不太容易理解,主要由于迭代不能像递归那样向上回溯,所以迭代向下遍历的过程中,无法保证根节点最后访问。  ...在递归的过程中需要向下传递坐标信息,并且通过 HashTable 记录各个节点的三元组信息( x 坐标、y 坐标,节点值),以便后续构造垂序序列:图片  得到坐标之后,需要对三元组进行综合排序,最后再根据

    41720

    递归遍历-LeetCode 124、112、113(递归遍历二叉树,回溯法)

    【LeetCode #124 二叉树的最大路径和】 给定一个非空二叉树,返回其最大路径和。 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。...因此使用递归算法从根节点开始遍历,如果左右子树最大路径和大于0,则取出该路径的最大值,否则为零,也就是说如果大于零,则加上之后result是可以增加的!...因此对result进行更新,同时递归函数也返回root->val + max(0, max(left, right))。...如果root本身为空或者不满足上述条件,返回false /** * Definition for a binary tree node....这里面需要注意的一点就是回溯法的使用,当修改了一个状态之后,递归结束后,需要把这个状态重新置为之前的状态。 比如tmp中push_back了一个值,当递归结束进行回溯阶段,需要pop_back()。

    90570

    前端工程师leetcode算法面试之二叉树深度广度遍历

    上一篇中也提到可以采用尾递归的书写方式,让 JavaScript 引擎去将递归优化成迭代,从而解决性能上的问题。但是在一些情况下,尾递归并没有那么好写,所以本文会同时给出递归和迭代的解决方案。  ...接下来,通过具体的题目解析,带大家了解 DFS 和 BFS 搜索思想在二叉树中的应用。二、102. 二叉树的层次遍历给定一个二叉树,返回其按层次遍历的节点值。(即逐层地,从左到右访问所有节点)。...图片2、DFS  采用 DFS 搜索思想,需要注意在递归的过程中记录当前节点的层次信息:图片三、145. 二叉树的后序遍历给定一个二叉树,返回它的 后序 遍历。  ...本道题目采用迭代实现 DFS 不太容易理解,主要由于迭代不能像递归那样向上回溯,所以迭代向下遍历的过程中,无法保证根节点最后访问。  ...在递归的过程中需要向下传递坐标信息,并且通过 HashTable 记录各个节点的三元组信息( x 坐标、y 坐标,节点值),以便后续构造垂序序列:图片  得到坐标之后,需要对三元组进行综合排序,最后再根据

    31340

    广联达0913秋招算法笔试真题解析

    若处于节点1,可以走向节点2或节点3,有2种可能的出口。若处于节点2,只有节点2本身一个出口;节点3同理 题目解析 本题其实是求以u为根节点的子树中的叶子节点的数目。..., leaf_num_dic, node): # 递归终止条件: # 如果node是一个叶节点,即其不包含任何子节点 # 将leaf_num_dic中的node储存为1...return 1 # 若node不是一个叶节点,则遍历其所有子节点child_node # 对子节点child_node进行dfs递归调用, # 计算每一个子节点所包含的叶节点个数...[p].append(c) # 构建一个哈希表,用于储存每一个节点下面的节点数 # key为节点的值,value为该节点下面的节点数 leaf_num_dic = dict() # 递归调用入口,根节点是...1 dfs(neighbor_dic, leaf_num_dic, 1) # 对于q_list中的每一个node,在哈希表leaf_num_dic中找到其下面叶节点的个数 ans = [leaf_num_dic

    48920
    领券