Given a binary tree, return all root-to-leaf paths.(给定一棵二叉树,返回所有根节点到叶子节点的路径)
For example, given the following binary tree:
1
/ \
2 3
\
5
All root-to-leaf paths are:
[“1->2->5”, “1->3”]
1.个人分析
采用先序遍历对二叉树进行遍历,在遍历的同时将经过的节点保存到结果集中去。
2.个人解法
void findPath(TreeNode *root, vector<string> &res, string path)
{
if(!root) return;
if(root->left == NULL && root->right == NULL){
if(path.empty()){
string str = to_string((long long)root->val);
path.append(str);
}
else {
string pointer = "->";
path.append(pointer);
string str = to_string((long long)root->val);
path.append(str);
}
res.push_back(path);
}
if(path.empty()){
string str = to_string((long long)root->val);
path.append(str);
}
else {
string pointer = "->";
path.append(pointer);
string str = to_string((long long)root->val);
path.append(str);
}
findPath(root->left, res, path);
findPath(root->right, res, path);
}
vector<string> binaryTreePaths(TreeNode* root)
{
vector<string> res;
string path;
findPath(root, res, path);
return res;
}
3.参考解法
void dfs(TreeNode* root, vector<string> &result,string branch)
{
if (!root->left && !root->right){
result.push_back(branch);
}
if (root->left) dfs(root->left, result, branch + "->" + to_string(root->left->val));
if (root->right) dfs(root->right, result, branch + "->" + to_string(root->right->val));
}
vector<string> binaryTreePaths(TreeNode* root)
{
vector<string> result;
if (!root) return result;
dfs(root, result, to_string(root->val));
return result;
}
4.总结
参考解法采用的是DFS,也就是后序遍历的方式进行路径查找,相比先序遍历代码更加简洁。
PS:
- 题目的中文翻译是本人所作,如有偏差敬请指正。
- 其中的“个人分析”和“个人解法”均是本人最初的想法和做法,不一定是对的,只是作为一个对照和记录。