110.平衡二叉树 (优先掌握递归)
leetcode链接
代码随想录链接
一刷状态:未通过(写不出递归的逻辑)
思路
判断型的题目,如果出现不满足的情况,则返回-1,满足则返回高度。
class Solution {
public:
int getHeight(TreeNode* root)
{
if(root==nullptr) return 0;
int leftHeight = getHeight(root->left);
if(leftHeight==-1) return -1;
int rightHeight = getHeight(root->right);
if(rightHeight==-1) return -1;
if(abs(leftHeight-rightHeight)>1) return -1;
else return 1+max(leftHeight, rightHeight);
}
bool isBalanced(TreeNode* root) {
if(root==nullptr) return 1;
if(getHeight(root)==-1) return 0;
return 1;
}
};
257. 二叉树的所有路径 (优先掌握递归)
leetcode链接
代码随想录链接
一刷状态:通过
思路
遇到叶子节点,则将结果保存,若未遇到叶子节点,则分别向左右搜索。
class Solution {
public:
void traversal(TreeNode* root, string path, vector<string>& result)
{
if(root!=nullptr)
{
path+=to_string(root->val);
if(root->left==nullptr&&root->right==nullptr) // 遇到叶子节点
{
result.push_back(path);
}
else // 未遇到叶子节点,则继续搜索
{
path+="->";
traversal(root->left, path, result);
traversal(root->right, path, result);
}
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
string path = "";
traversal(root, path, result);
return result;
}
};
class Solution {
public:
void traversal(TreeNode* root, string path, vector<string>& result)
{
if(root->left==nullptr&&root->right==nullptr) // 遇到叶子节点
{
path+=to_string(root->val);
result.push_back(path);
return;
}
if(root->left!=nullptr) //非空左孩子
{
traversal(root->left, path+to_string(root->val)+"->", result);
}
if(root->right!=nullptr) //非空右孩子
{
traversal(root->right, path+to_string(root->val)+"->", result);
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
string path = "";
traversal(root, path, result);
return result;
}
};
404.左叶子之和 (优先掌握递归)
leetcode链接
代码随想录链接
一刷状态:通过
思路
重点在于判断左叶子,将左叶子的值累加起来,向左右子叶继续搜索下去。
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if(root==nullptr) return 0;
int leftVal = 0;
if(root->left!=nullptr&&root->left->left==nullptr&&root->left->right==nullptr)
leftVal = root->left->val;
return leftVal+sumOfLeftLeaves(root->left)+sumOfLeftLeaves(root->right);
}
};