题目(leecode T257):
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
方法:本题需要对二叉树中的所有路径进行遍历,并且是从根节点到所有的叶子节点。我们需要使用回溯的思想,回溯即是在找到每一条路径的结束之后,我们需要返回上一个节点,继续寻找是否有可行的路径。同样使用遍历,我们需要传入的参数是要处理的节点,path路径和保存结果的result数组。迭代的终止条件是当我们到达了也是节点,即cur->left==NULL && cur->right==NULL。此时我们就可以处理种植逻辑,即把path路径中的所有的元素都放到result数组中作为一条结果保存下来。其他情况下有左节点或右节点时我们都需要进行一次迭代与回溯。
题解:
class Solution {
private:void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {path.push_back(cur->val); // 节点进入路径进行保存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;}if (cur->left) { // 左 traversal(cur->left, path, result);path.pop_back(); // 回溯}if (cur->right) { // 右traversal(cur->right, path, result);path.pop_back(); // 回溯}}public:vector<string> binaryTreePaths(TreeNode* root) {vector<string> result;vector<int> path;if (root == NULL) return result;traversal(root, path, result);return result;}
};