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)"是一样的效果,都是阻止对空结点的操作,前者是对空结点递归,但是这个递归函数什么都不做,后者是阻止对空结点进行递归,因此有前者就不要有后者,但是两者必须存在一个如果不存在就会犯一个错误就是当一个结点的左节点或则右节点为空的时候进空结点递归很可能就对空结点进行取左右节点或则取值操作
力扣上常报的一个错就是因为犯了这个错误
1 class Solution { 2 public: 3 TreeNode* alg(TreeNode* root, int val,TreeNode*result){ 4 if(root->left==nullptr&&root->right==nullptr){ 5 if(val<root->val){ 6 root->left=result; 7 } 8 else if(val>root->val){ 9 root->right=result; 10 } 11 return root; 12 } 13 if(val<root->val) alg(root->left,val,result); 14 if(val>root->val) alg(root->right,val,result); 15 return root; 16 } 17 TreeNode* insertIntoBST(TreeNode* root, int val) { 18 TreeNode*result=new TreeNode(val); 19 if(root==nullptr){ 20 return result; 21 } 22 else return alg(root, val,result); 23 } 24 };
- 但是有回溯的时候阻止对空结点的操作要用"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