平衡二叉树每个节点的左子树和右子树高度差<=1,写的时候明显感觉递归写的很懵逼。
递归三部曲再强调一下:确定函数返回类型和传入参数;确定终止条件;确定单层递归逻辑
这里感觉像是掌握套路一样,不太熟悉还,看了一个视频递归算法很难?小s带你10分钟完成手把手推导,用递归求二叉树深度_哔哩哔哩_bilibili这个讲的递归很详细,这个 明白之后,就是要注意如果左子树是 -1 就是高度差>1 就return -1
class Solution {
public:
bool relsut;
int hight(TreeNode* node) {
if(node == NULL) return 0;
int left_num = hight(node->left);
if(left_num == -1) return -1;
int right_num = hight(node->right);
if(right_num == -1) return -1;
int n = left_num > right_num ? left_num - right_num : right_num - left_num;
if(n > 1) return -1;
else return 1 + max(left_num, right_num);
}
bool isBalanced(TreeNode* root) {
if(root == NULL) return true;
int rel = hight(root);
return rel == -1 ? false : true;
}
};
题目2:257. 二叉树的所有路径 - 力扣(LeetCode)
我只能说很懵逼,先这样吧,后面再详细的看一看
class Solution {
public:
void findpath(TreeNode* node, vector<int>& path, vector<string>& rel) {
path.push_back(node->val);
if(node->left == NULL && node->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]);
rel.push_back(spath);
return;
}
if(node->left) {
findpath(node->left, path, rel);
path.pop_back();
}
if(node->right) {
findpath(node->right, path, rel);
path.pop_back();
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> reslut;
vector<int> path;
findpath(root, path, reslut);
return reslut;
}
};
这道题自己想了想,有点思路但是又好像没有的,最后也没写完失败了。然后看了看代码,首先是对于递归的写法有点理解了,然后就是那个确定左叶子的条件,这里确定左也是是通过父节点确定的,(node->left != NULL && node->left->left == NULL & node->left->right == NULL)
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 && root->left->left == NULL && root->left->right == NULL) {
leftnum = root->left->val;
}
int rightnum = sumOfLeftLeaves(root->right);
return leftnum + rightnum;
}
};