代码随想录第十七天|110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和
思路代码来源:http://acwing.com
110.平衡二叉树
我是一看就会,一写就废。先看代码:
class Solution {
public:
bool res;
bool isBalanced(TreeNode* root) {
if(!root) return true;
res = true;
dfs(root);
return res;
}
int dfs(TreeNode* root)
{
if(!root) return true;
int lt = dfs(root->left);
int rt = dfs(root->right);
if(abs(lt - rt) > 1) res = false;
return max(lt,rt) + 1;
}
};
我还是那句话递归是看着简单,但是难写,所以我还是积累积累经验,这里的平衡二叉树的主要思想就是左右的高低差不超过一,可以用绝对值来判断,首先判断根节点,然后对左右子树进行分析,这里我解释一下为什么用max(),因为只要保证高度差不超过1,当然要选择最高的来比较。
257. 二叉树的所有路径
class Solution {
public:
vector<string> res;
vector<int> path;
vector<string> binaryTreePaths(TreeNode* root) {
if(!root) return res;
dfs(root);
return res;
}
void dfs(TreeNode* root)
{
path.push_back(root->val);
if(!root->left && !root->right)
{
string line = to_string(path[0]);
for(int i = 1;i < path.size();i++)
{
line += "->" + to_string(path[i]);
}
res.push_back(line);
}
else
{
if(root->left) dfs(root->left);
if(root->right) dfs(root->right);
}
path.pop_back();
}
};
这道题目感觉有点回溯的意思,但是涉及的不是很深,这段代码感觉挺有意思,res存储最后结果,path存储每一条路径,上来老规矩,判断根节点,然后,先往路径上存值,这里先push,后pop,有人会问是不是这个数进去,然后过一会就出来了?不是,问这个问题的人还需要再看看递归,从root开始(如果root不为空的话),然后向左右子树去遍历,每次都把值记录到path里面,当遇到叶子节点的时候,就将叶子前进到path的值全部用->连接,并且用to_string()转化,最后全部出path。
404.左叶子之和
先看代码:
class Solution {
public:
int res = 0;
int sumOfLeftLeaves(TreeNode* root) {
if(!root) return 0;
dfs(root);
return res;
}
void dfs(TreeNode* root)
{
if(!root) return;
if(root->left)
{
if(!root->left->left && !root->left->right)
res += root->left->val;
}
dfs(root->left);
dfs(root->right);
}
};
这道题我觉得简单,但是也难,不好说,可能就是递归自己写不好写。
总结:
遇事不决,回去看题干。