二叉树的所有路径

发布时间 2023-08-17 00:40:06作者: 小凉拖

257. 二叉树的所有路径 - 力扣(LeetCode)

经验1:终止条件的讨论

"if (root == nullptr)return;"的作用

  • 首先写在主要函数中(也就是lecode所给的函数),作用是如果是一个空树传进了主要函数,那么我就让主要函数直接返回,就不要走算法函数了,也就是防空树的作用。
  • 如果一个递归函数写不出终止条件,它可以用来它来做终止条件,比如前序遍历
1 void front(TreeNode* root, vector<int>& result) {
2     if (root->left == nullptr && root->left == nullptr) {
3         result.push_back(root->val);
4         return;
5     }
6     front(root->left, result);
7     front(root->right, result);
8 }

如果这么些当root->left为空的时候,就对空结点执行了一次递归,递归中会操作空结点的左右子节点导致异常的抛出,因此这个程序写不出终止条件就得用"if (root == nullptr)return;"作为终止条件

  • "if (root == nullptr)return;"和"if(root->left)"、"if(root->right)"是一样的效果,都是阻止对空结点的操作,前者是对空结点递归,但是这个递归函数什么都不做,后者是阻止对空结点进行递归,因此有前者就不要有后者
  • 但是有回溯的时候阻止对空结点的操作要用"if(root->left)"、"if(root->right)",达到不要对空结点递归的作用,如果你不写"if(root->left)"、"if(root->right)"而是用"if (root == nullptr)return;"代替,你就会在运行完空结点的时候进行回溯而将根节点弹出去

 

 

 1 class Solution {
 2 public:
 3     void traversal(TreeNode* root,vector<string>&result,vector<int>&path){//算法函数
 4         if(root==nullptr) return;
 5         path.push_back(root->val);
 6         if(root->left==nullptr&&root->right==nullptr) {
 7             string spath;
 8             for(int i=0;i<path.size();++i){
 9                 if(i==path.size()-1) spath=spath+to_string(path[i]);  
10                 else spath=spath+to_string(path[i])+"->";               
11             }
12             result.push_back(spath);
13             return;
14         }
15 
16         traversal(root->left,result,path);
17         path.pop_back();
18         traversal(root->right,result,path);
19         path.pop_back();
20  
21     }
22 vector<string> binaryTreePaths(TreeNode* root) {//主要函数 23 vector<string>result; 24 vector<int>path; 25 if(root==nullptr) return result; 26 traversal(root,result,path); 27 return result; 28 } 29 };

经验2:

仅限lecode题的经验

当不能在每次递归创建一个创建一个对象时,就必须再创建一个函数,在lecode给的函数中创建这个对象比如本题的result,path