LeetCode刷题--- 二叉树的所有路径
2023-12-15 14:47:06
个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客
个人专栏
力扣递归算法题 ? ? ? 【 ?http://t.csdnimg.cn/yUl2I ? 】
【C++】 ? ? ? ? ? ? ? ? ?【 ?http://t.csdnimg.cn/6AbpV 】
数据结构与算法 ? ? ? 【 ?http://t.csdnimg.cn/hKh2l ?】
前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的 ?
我讲述题目会把讲解部分分为3个部分:
1、题目解析
2、算法原理思路讲解
3、代码实现
二叉树的所有路径
题目链接:二叉树的所有路径
题目
给你一个二叉树的根节点?root
?,按?任意顺序?,返回所有从根节点到叶子节点的路径。
叶子节点?是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]
示例 2:
输入:root = [1] 输出:["1"]
提示:
- 树中节点的数目在范围?
[1, 100]
?内 -100 <= Node.val <= 10
解法
题目解析
题目意思很简单,给我们一颗二叉树,让我们返回二叉树所有的路径
例如:
输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]
算法原理思路讲解???
算法思路
使?深度优先遍历(DFS)求解。
路径以字符串形式存储,从根节点开始遍历,每次遍历时将当前节点的值加?到路径中,如果该节点为叶?节点,将路径存储到结果中。否则,将 "->" 加?到路径中并递归遍历该节点的左右?树。
定义?个结果数组,进?递归。递归具体实现?法如下:
- 如果当前节点不为空,就将当前节点的值加?路径 path 中,否则直接返回;
- 判断当前节点是否为叶?节点,如果是,则将当前路径加?到所有路径的存储数组 ret?中;
- 否则,将当前节点值加上 "->" 作为路径的分隔符,继续递归遍历当前节点的左右?节点。
?代码实现?
- 时间复杂度:O(N^2),其中 N 表示节点数目。在深度优先搜索中每个节点会被访问一次且只会被访问一次,每一次会对 path 变量进行拷贝构造,时间代价为 O(N),故时间复杂度为 O(N^2)。
- 空间复杂度:O(N^2),其中 N 表示节点数目。除答案数组外我们需要考虑递归调用的栈空间。在最坏情况下,当二叉树中每个节点只有一个孩子节点时,即整棵二叉树呈一个链状,此时递归的层数为 NNN.
/** * 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> ret; void dfs(TreeNode* root , string path) { if (root != nullptr) path += to_string(root->val); else return ; if(root->left == nullptr && root->right == nullptr) { ret.push_back(path); return; } path += "->"; if(root->left) dfs(root->left, path); if(root->right) dfs(root->right, path); } vector<string> binaryTreePaths(TreeNode* root) { string path; if(root == nullptr) return ret; dfs(root,path); return ret; } };
文章来源:https://blog.csdn.net/weixin_74268082/article/details/135014778
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!