代码随想录 | Day20 | 二叉树:二叉树所有路径&&左叶子之和
主要学习内容:
1.利用二叉树的谦虚遍历进行题目解答
2.to_string函数的使用
257.二叉树所有路径
257. 二叉树的所有路径 - 力扣(LeetCode)
解法一:直接遍历
本次使用的是前序遍历
1.函数参数和返回值
1
| void tra(string s,TreeNode *t)
|
如果不使用全局变量vector的话为
1
| void tra(vector<string>,string s,TreeNode *t)
|
2.终止条件
1 2 3 4 5 6 7 8
| if(t==nullptr) return; if(t->left==nullptr&&t->right==nullptr) { s+=to_string(t->val); res.push_back(s); return; }
|
只有我们遍历到叶子结点的时候才能收集结果,而前面的非空判断是确保有左右孩子
然后正常收集结果,注意to_string函数的使用
3.本层代码逻辑
1 2 3 4
| s+=to_string(t->val); s+="->"; tra(s,t->left); tra(s,t->right);
|
如果不是叶子结点就会进入本层代码逻辑,加入”->”和t->val,然后继续遍历左右子树
4.完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public: vector<string> res; void tra(string s,TreeNode *t) { if(t==nullptr) return; if(t->left==nullptr&&t->right==nullptr) { s+=to_string(t->val); res.push_back(s); return; } s+=to_string(t->val); s+="->"; tra(s,t->left); tra(s,t->right); } vector<string> binaryTreePaths(TreeNode* root) { string s; tra(s,root); return res; } };
|
解法二:回溯法
就是经典的回溯算法求路径+把路径处理为字符串,可以等到学完回溯算法后再回来掌握。
这里附上代码随想录的解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| 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++) { 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; } };
|
404.左叶子之和
404. 左叶子之和 - 力扣(LeetCode)
代码随想录的后序遍历很容易把人绕晕,建议用前序遍历直接做
解法:前序遍历
就把他当做一个普通的遍历+两个if判断即可
1.函数参数和返回值
如果不使用全局变量vector的话为,sum为当前的叶子之和
1
| void tra(TreeNode *t,int sum)
|
2.终止条件
3.本层代码逻辑
1 2 3 4 5
| if(t->left!=nullptr) if(t->left->left==nullptr&&t->left->right==nullptr) sum+=t->left->val; tra(t->left); tra(t->right);
|
判断左子树是否为空,不为空判断是不是左叶子,如果是的话就加上,不是的话就继续遍历即可
完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public: int sum=0; void tra(TreeNode *t) { if(t==nullptr) return; if(t->left!=nullptr) if(t->left->left==nullptr&&t->left->right==nullptr) sum+=t->left->val; tra(t->left); tra(t->right); } int sumOfLeftLeaves(TreeNode* root) { tra(root); return sum; } };
|