题目
给你一个二叉树的根节点
root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]示例 2:
输入:root = [1] 输出:["1"]
代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <stack>
#include <queue>
#include <string>
using namespace std;
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) {}
};
// leetcode 257 二叉树的所有路径
// 递归法
class Solution {
public:
void traversal(TreeNode* cur, string path, vector<string>& result)
{
path += to_string(cur->val);
if (cur->left == nullptr && cur->right == nullptr)
{
result.push_back(path);
return;
}
if (cur->left != nullptr)
{
traversal(cur->left, path + "->", result); //没有修改path的值
}
if (cur->right != nullptr)
{
traversal(cur->right, path + "->", result);
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
if (root == nullptr)
{
return result;
}
string path;
traversal(root, path, result);
return result;
}
};
// 迭代法
// 深度搜索问题
// 使用栈来保存结点 一个栈来保存多条路径
// 每次弹出结点 如果是叶子结点就保存一条路径
// 如果不是叶子就入栈 然后栈中路径更新
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result; //最终结果
stack<TreeNode*> treeSta; //保存结点
stack<string> pathSta;//保存的路径
if (root == nullptr)
{
return result;
}
TreeNode* cur;
treeSta.push(root);
string path = to_string(root->val); // 我们从这里开始就保持先加入值后遍历结点
pathSta.push(path);
while (!treeSta.empty())
{
cur = treeSta.top();
treeSta.pop();
path = pathSta.top();
pathSta.pop();
if (cur->left == nullptr && cur->right == nullptr)
{
result.push_back(path);
}
else
{
if (cur->left != nullptr)
{
treeSta.push(cur->left);
pathSta.push(path + "->" + to_string(cur->left->val));
//先加入值后遍历结点
}
if (cur->right != nullptr)
{
treeSta.push(cur->right);
pathSta.push(path + "->" + to_string(cur->right->val));
//先加入值后遍历结点
}
}
}
return result;
}
};