代码随想录算法训练营第17天|110.平衡二叉树 |257. 二叉树的所有路径 | 404.左叶子之和
详细布置
迭代法,大家可以直接过,二刷有精力的时候 再去掌握迭代法。
110.平衡二叉树 (优先掌握递归)
再一次涉及到,什么是高度,什么是深度,可以巩固一下。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
// -1 表示已经不是平衡二叉树了,否则返回值是以该节点为根节点树的高度
int getheight(TreeNode* node)//明确递归函数的参数和返回值
{
if(node==NULL)//明确终止条件
return 0;
int leftheight=getheight(node->left);// 左
if(leftheight==-1)return -1;
int rightheight=getheight(node->right);// 右
if(rightheight==-1)return -1;
int result;
if(abs(leftheight-rightheight)>1)
{
return -1;
}
else return 1+max(leftheight,rightheight);// 以当前节点为根节点的树的最大高度
}
bool isBalanced(TreeNode* root) {
return getheight(root)!=-1?true:false;
}
};
257. 二叉树的所有路径 (优先掌握递归)
这是大家第一次接触到回溯的过程, 我在视频里重点讲解了 本题为什么要有回溯,已经回溯的过程。
如果对回溯 似懂非懂,没关系, 可以先有个印象。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0257.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%89%80%E6%9C%89%E8%B7%AF%E5%BE%84.html
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void traversal(TreeNode *node,vector<int>&path,vector<string>&result)
{
path.push_back(node->val);// 中,中为什么写在这里,因为最后一个节点也要加入到path中
if(node->left==NULL&&node->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(node->left)//左
{
traversal(node->left,path,result);
path.pop_back();//回溯
}
if(node->right)//右
{
traversal(node->right,path,result);
path.pop_back();//回溯
}
}
vector<string> binaryTreePaths(TreeNode* root)
{
vector<int> path;
vector<string> result;
if(root==NULL)return result;
traversal(root,path,result);
return result;
}
};
404.左叶子之和 (优先掌握递归)
其实本题有点文字游戏,搞清楚什么是左叶子,剩下的就是二叉树的基本操作。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0404.%E5%B7%A6%E5%8F%B6%E5%AD%90%E4%B9%8B%E5%92%8C.html
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if(root==NULL)
return 0;
if(root->left==NULL&&root->right==NULL)
return 0;
int leftnum=sumOfLeftLeaves(root->left);//左
if(root->left!=NULL&&root->left->left==NULL&&root->left->right==NULL)//左
leftnum=root->left->val;
int rightnum=sumOfLeftLeaves(root->right);//右
return leftnum+rightnum;//中--------返回所有左叶子的值
}
};