目录
257. 二叉树的所有路径
问题描述
思路:
这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。
这道题涉及到回溯,因此,我们要把路径记录下来,需要回溯来回退一一个路径在进入另一个路径。
1、递归
① 递归函数函数参数以及返回值
要传入根节点,记录每一条路径的path,和存放结果集的result,这里递归不需要返回值,代码如下:
void traversal(TreeNode* cur, vector<int>& path, vector<string>& result)
② 确定递归终止条件
因为本题要找到叶子节点,即cur不为空,其左右孩子都为空的时候,就找到叶子节点。
所以本题的终止条件是:
if (cur->left == NULL && cur->right == NULL) {
//接下来,写处理终止的逻辑
}
这里用vector结构的path来记录路径,所以要把vector结构的path转为string格式,在把这个string 放进 result里。
这里用vector的原因是,在处理单层递归逻辑的时候,要回溯,vector方便回溯。
所以本题的处理终止逻辑是:
if (cur->left == NULL && cur->right == NULL) {
// 遇到叶子节点
string sPath;
for (int i = 0; i < path.size() - 1; i++) {
// 将path里记录的路径转为string格式
sPath += to_string(path[i]);
sPath += "->";
}
sPath += to_string(path[path.size() - 1]); // 记录最后一个节点(叶子节点)
result.push_back(sPath); // 收集一个路径
return;
}
③ 确定单层递归逻辑
因为是前序遍历,需要先处理中间节点,中间节点就是我们要记录路径上的节点,先放进path中。
path.push_back(cur->val);
然后是递归和回溯的过程,上面说过没有判断cur是否为空,那么在这里递归的时候,如果为空就不进行下一层递归了。
所以递归前要加上判断语句,下面要递归的节点是否为空,如下
if (cur->left) {
traversal(cu