@代码随想录算法训练营第17天 | LeetCode110 平衡二叉树,257. 二叉树的所有路径,404.左叶子之和
110 平衡二叉树
第一遍读题思考
什么是平衡二叉树?
代码随想录解法思路
对于平衡二叉树来说,每个节点的左右子树的高度差不超过1.所以还是后序遍历,因为高度是从下往上看,而深度是从上往下看,所以要先确定当前节点的左右两个子树是不是平衡二叉树,然后再判断当前根节点是否是平衡二叉树。介绍了递归的方法和迭代的方法。
c++代码具体实现注意事项
(递归版本)
/**
* 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 getHeight(TreeNode* node){
if(node==NULL)return 0;
int leftHeight{0};
int rightHeight{0};
leftHeight = getHeight(node->left);
rightHeight = getHeight(node->right);
if(leftHeight==-1 || rightHeight==-1)return -1;
else if(abs(leftHeight-rightHeight)<=1)return 1+max(leftHeight,rightHeight);
else return -1;
}
bool isBalanced(TreeNode* root) {
return getHeight(root)==-1 ? false:true;
}
};
257. 二叉树的所有路径
第一遍读题思考
先找到叶子节点然后回溯,但是不知道怎么回溯。
代码随想录解法思路
讲解了回溯,但其实我觉得仍然是递归三部曲,首先确定传入参数和返回参数是什么。第二,确定终止条件,这里的终止条件就是考虑遍历到叶子节点的时候需要把result加一条路径了。那么第三步就是单层逻辑,就是叶子节点之前应该怎么办?其实就是怎么让终止逻辑里的path是一条完整的路径
c++代码具体实现注意事项
/**
* 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 getPath(TreeNode* node, vector<int> &path, vector<string> &result){
if(node!=NULL && node->left==NULL && node->right==NULL){
path.push_back(node->val);
string s="";
for(int i=0;i<path.size();i++){
if(i!=path.size()-1){
s += to_string(path[i]);
s += '-';
s += '>';
}
else{
s += to_string(path[i]);
}
}
result.push_back(s);
return;
}
path.push_back(node->val);
if(node->left){
getPath(node->left, path, result);
path.pop_back();
}
if(node->right){
getPath(node->right, path, result);
path.pop_back();
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
vector<int> path;
getPath(root, path, result);
return result;
}
};
404.左叶子之和
第一遍读题思考
用递归,是一个不规则前序遍历,设置传入参数为根节点和一个bool类型判断是否为左,终止条件就是如果当前节点是左叶子节点,那么返回val,右叶子节点返回0。然后单层逻辑就是拿到左子树的左叶子节点之和和右子树的左叶子节点之和。
代码随想录解法思路
没看思路,大概也是递归三部曲。但是跑了代码随想录的代码,运行时间比我的长,内存占用少很多。
c++代码具体实现注意事项
注意递归函数是怎么传参的。
/**
* 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 getSum(TreeNode* node, const bool &left){
if(node!=NULL && node->left==NULL && node->right==NULL){
if(left)return node->val;
else return 0;
}
int result{0};
if(node->left) result += getSum(node->left, true);
if(node->right) result += getSum(node->right, false);
return result;
}
int sumOfLeftLeaves(TreeNode* root) {
return getSum(root, false);
}
};