当前位置: 首页 > article >正文

LeetCode 257.二叉树的所有路径

题目描述

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

示例 2:

输入:root = [1]
输出:["1"]

提示:

  • 树中节点的数目在范围 [1, 100] 内
  • -100 <= Node.val <= 100

思路

本题要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。

递归三部曲:

  1. 确定递归函数的参数和返回值。要传入根节点,记录每一条路径的path,和存放结果集的result,这里递归不需要返回值。
  2. 确定终止条件。本题没有必要遍历到空节点才结束,只需要遍历到叶子结点就可以结束了。当cur不为空,且其左右孩子都为空的时候,就找到叶子节点了。
  3. 确定单层递归的逻辑。因为是前序遍历,需要先处理中间节点,中间节点就是我们要记录路径上的节点,先放进path中。然后是递归和回溯的过程,递归时需要先判断cur是否为空,如果为空就不进行下一层递归了。递归之后就要回溯,因为path不能一直加入节点,它还要删节点,然后才能加入新的节点。

代码

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:
    // 递归法
    // path存放路径,result存放结果集
    void traversal(TreeNode* n,vector<int>& path,vector<string>& result){
        // 中
        path.push_back(n->val);
        // 终止条件,到达叶子节点
        if(n->left==NULL && n->right==NULL){
            string sPath;
            for (int i = 0; i < path.size() - 1; i++) {
                sPath += to_string(path[i]);
                sPath += "->";
            }
            sPath += to_string(path[path.size() - 1]);
            result.push_back(sPath);
            return; 
        }
        // 左
        if(n->left){
            traversal(n->left,path,result);
            path.pop_back(); // 回溯
        }
        // 右
        if(n->right){
            traversal(n->right,path,result);
            path.pop_back(); // 回溯
        }
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<int> path;
        vector<string> result;
        if(root==NULL) return result;
        traversal(root,path,result);
        return result;
    }
};

Python版:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def traversal(self, cur, path, result):
        path.append(cur.val)  # 中
        if not cur.left and not cur.right:  # 到达叶子节点
            sPath = '->'.join(map(str, path))
            result.append(sPath)
            return
        if cur.left:  # 左
            self.traversal(cur.left, path, result)
            path.pop()  # 回溯
        if cur.right:  # 右
            self.traversal(cur.right, path, result)
            path.pop()  # 回溯
    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        result = []
        path = []
        if not root:
            return result
        self.traversal(root, path, result)
        return result

需要注意的地方

1.如果使用迭代法来解决本题,除了模拟递归需要一个栈,同时还需要一个栈来存放对应的遍历路径。


http://www.kler.cn/a/534524.html

相关文章:

  • libdrm移植到arm设备
  • 2025开源DouyinLiveRecorder全平台直播间录制工具整合包,多直播同时录制、教学直播录制、教学视频推送、简单易用不占内存
  • 【漫话机器学习系列】070.汉明损失(Hamming Loss)
  • AlwaysOn 可用性组副本所在服务器以及该副本上数据库的各项状态信息
  • JPA使用@EntityGraph立即加载关联实体
  • 哈夫曼树原理及其C语言实现
  • BUU10 [极客大挑战 2019]LoveSQL1
  • RK3576——USB3.2 OTG无法识别到USB设备
  • docker容器编排工具 docker compose
  • 【Elasticsearch】 邻接矩阵聚合(Adjacency Matrix Aggregation)
  • ASP.NET Core中间件Markdown转换器
  • 数据加载器--不同文档数据格式的加载方法
  • seata 1.3.0 本地安装步骤
  • go-zero学习笔记(四)
  • python(自学10-2)获取豆瓣页面 下载成json格式
  • 7.PPT:“中国梦”学习实践活动【20】
  • MySQL常见的存储引擎和区别
  • ASP.NET Core与EF Core的集成
  • 系留无人机通信中继、空地组网技术详解
  • Spring ApplicationContext接口及其实现类的作用
  • React中为每个列表项显示多个DOM节点的解决方案
  • GS论文阅读--Mini-Splatting
  • vscode+Cmake配置c++轻量级环境
  • Java进阶13 线程池
  • Racecar Gym 代码
  • 深入解析:如何利用 Python 爬虫获取商品销量详情