(算法)⼆叉树的所有路径————<递归>

1. 题⽬链接:257.⼆叉树的所有路径 

2. 题⽬描述:

3. 解法(回溯):

算法思路:

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

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

定义⼀个结果数组,进⾏递归。递归具体实现⽅法如下:

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

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

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

4. 返回结果数组。

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

具体实现⽅法如下:

1. 定义⼀个结果数组和⼀个路径数组。

2. 从根节点开始递归,递归函数的参数为当前节点、结果数组和路径数组。

        a. 如果当前节点为空,返回。

        b. 将当前节点的值加⼊到路径数组中。

        c. 如果当前节点为叶⼦节点,将路径数组中的所有元素拼接成字符串,并将该字符串存储到结果 数组中。

        d. 递归遍历当前节点的左⼦树。

        e. 递归遍历当前节点的右⼦树。

        f. 回溯,将路径数组中的最后⼀个元素移除,以返回到上⼀个节点。

3. 返回结果数组。  

C++算法代码: 

/**
 * 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:
    vector<string>key;
    void dfs(TreeNode* root,string t)
    {
        t+=to_string(root->val);
        //出口
        if(root->left==nullptr&&root->right==nullptr)
        {
            key.push_back(t);
            return;
        }
        t+="->";
        //前序遍历
        if(root->left)
        {
            dfs(root->left,t);
        }
        if(root->right)
        {
            dfs(root->right,t);
        }
    }
    vector<string> binaryTreePaths(TreeNode* root) 
    {
        //将字符串设置为函数内参数,就不用手动恢复
        string t;
        dfs(root,t);
        return key;
    }
};

Java算法代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 * int val;
 * TreeNode left;
 * TreeNode right;
 * TreeNode() {}
 * TreeNode(int val) { this.val = val; }
 * TreeNode(int val, TreeNode left, TreeNode right) {
 * this.val = val;
 * this.left = left;
 * this.right = right;
 * }
 * }
 */
class Solution
{
	int count;
	int ret;
	public int kthSmallest(TreeNode root, int k)
	{
		count = k;
		dfs(root);
		return ret;
	}
	void dfs(TreeNode root)
	{
		if (root == null || count == 0) return;
		dfs(root.left);
		count--;
		if (count == 0) ret = root.val;
		if (count == 0) return;
		dfs(root.right);
	}
}
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

课堂随笔

感谢支持~~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值