《算法题讲解指南:递归,搜索与回溯算法--二叉树中的深搜》--10.二叉搜索树中第k小的元素,11.二叉树的所有路径

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》

《算法题讲解指南》--优选算法

《算法题讲解指南》--递归、搜索与回溯算法

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

10.二叉搜索树中第k小的元素

题目链接:

题目描述:

题目示例:

解法二(中序遍历+计数器剪枝):

算法思路:

C++算法代码:

算法总结及流程解析:

11.二叉树的所有路径

题目链接:

题目描述:

题目示例:

解法(回溯):

算法思路:

C++算法代码:

算法总结及流程解析:

结束语


10.二叉搜索树中第k小的元素

题目链接:

230. 二叉搜索树中第 K 小的元素 - 力扣(LeetCode)

题目描述:

题目示例:

解法二(中序遍历+计数器剪枝):

算法思路:

上述解法不仅使用大量额外空间存储数据,并且会将所有的结点都遍历一遍。

但是,我们可以根据中序遍历的过程,只需扫描前k个结点即可。

因此,我们可以创建一个全局的计数器 count ,将其初始化为 k每遍历一个节点就将 count--。直到某次递归的时候,count 的值等于0,说明此时的结点就是我们要找的结果。

C++算法代码:

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int count, ret = 0;
    int kthSmallest(TreeNode* root, int k)
    {
        count = k;
        dfs(root);
        return ret;
    }

    void dfs(TreeNode* root)
    {
        if(root == nullptr || count == 0)
        {
            return;
        }
        dfs(root->left);
        if(--count == 0)
        {
            ret = root->val;
            return;
        }
        dfs(root->right);
    }
};

算法总结及流程解析:

11.二叉树的所有路径

题目链接:

257. 二叉树的所有路径 - 力扣(LeetCode)

题目描述:

题目示例:

解法(回溯):

算法思路:

使用深度优先遍历 (DFS)求解。

路径以字符串形式存储,从根节点开始遍历,每次遍历时将当前节点的值加入到路径中,如果该节点为叶子节点,将路径存储到结果中。否则,将 "->" 加入到路径中并递归遍历该节点的左右子树。

定义一个结果数组,进行递归。递归具体实现方法如下:

1.如果当前节点不为空 ,就将当前节点的值加入路径 path 中否则直接返回;

2.判断当前节点是否为叶子节点,如果是,则将当前路径加入到所有路径的存储数组path 中;

3.否则,将当前节点值加上 "->" 作为路径的分隔符 ,继续递归遍历当前节点的左右子节点;

4.返回结果数组。

特别地,我们可以只使用一个字符串存储每个状态的字符串,在递归回溯的过程中,需要将路径中的当前节点移除,以回到上一个节点。

C++算法代码:

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    //解法一(path为局部变量,回溯时无需手动删除就可以保证"恢复现场",因为当前递归修改path不会影响上一层递归path的结果)
    vector<string> ret;//用全局变量ret记录所有路径,全局不会受到递归回溯的影响
    vector<string> binaryTreePaths(TreeNode* root) 
    {
        string path;//用局部变量path记录路径的值,不用全局变量是为了便于回溯时"恢复原状"
        dfs(root, path);
        return ret;
    }

    void dfs(TreeNode* root, string path)
    {
        //递归的结束条件:当前结点为空则结束递归进行返回
        if(root == nullptr)
        {
            return;
        }

        //当遇到叶子结点时则不用再添加箭头,并且此时一条路径已经结束,
        //用string数组ret进行记录并且直接返回
        if(root->left == nullptr && root->right== nullptr)
        {
            path += to_string(root->val);
            ret.push_back(path);
            return;
        }
        //前序遍历
        path += to_string(root->val);
        path += "->";
        dfs(root->left, path);
        dfs(root->right, path);
    }
};

算法总结及流程解析:

结束语

到此,10.二叉搜索树中第k小的元素,11.二叉树的所有路径 这两道算法题就讲解完了。**二叉搜索树中查找第k小的元素 通过中序遍历结合计数器剪枝优化,只需遍历前k个节点即可得到结果,避免不必要的遍历;二叉树所有路径 采用深度优先搜索(DFS)回溯算法,使用局部变量记录路径,在遇到叶子节点时将完整路径存入结果集。**希望大家能有所收获!

相关推荐
澈20713 小时前
C++多态编程:从原理到实战
开发语言·c++
6Hzlia13 小时前
【Hot 100 刷题计划】 LeetCode 24. 两两交换链表中的节点 | C++ 精准指针舞步
c++·leetcode·链表
隔壁大炮13 小时前
Day07-RNN介绍
人工智能·pytorch·rnn·深度学习·神经网络·算法·numpy
汉克老师14 小时前
GESP2025年6月认证C++五级( 第一部分选择题(9-15))
c++·贪心算法·分治算法·二分算法·gesp5级·gesp五级·高精度除法
WL_Aurora14 小时前
Python 算法基础篇之什么是算法
python·算法
墨染天姬14 小时前
[AI]DeepSeek-R1的GRPO算法
人工智能·算法·php
D_C_tyu14 小时前
JavaScript | 数独游戏核心算法实现
javascript·算法·游戏
qiqsevenqiqiqiqi14 小时前
MT2048三连 暴力→数学推导→O (n) 优化
数据结构·c++·算法
ximu_polaris14 小时前
设计模式(C++)-行为型模式-模版方法模式
c++·设计模式
码之气三段.14 小时前
十五届山东ccpc省赛补题(update)
数据结构·c++·算法