1、110平衡二叉树

给定一个二叉树,判断它是否是平衡二叉树。
平衡二叉树:指该树所有节点的左右子树的高度相差不超过1

我的思路:这道题和最大深度不同,最大深度只需要递归返回最大深度,但是这里有两个信息需要返回,一个是返回节点高度来供父节点处理,二是当前节点不满足平衡就返回false。我把高度作为参数,返回值为是否平衡。
代码随想录:看了代码随想录,由于高度始终为正,所以可以把-1作为否平衡,>0作为平衡。这样就只需要一个返回值,也就是当前节点的高度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 我的思路
class Solution {
public:
bool traverse(TreeNode* root,int &hig){
if(root == nullptr){
hig = 0;
return true;
}
int higl = 0,higr = 0;
if(traverse(root->left,higl) == false ||
traverse(root->right,higr) == false){
return false;
}
if(std::abs(higl-higr)>1)return false;
hig = 1+std::max(higl,higr);
return true;
}
bool isBalanced(TreeNode* root) {
int hig = 0;
return traverse(root,hig);
}
};
// 代码随想录
class Solution {
public:
// 返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了则返回-1
int getHeight(TreeNode* node) {
if (node == NULL) {
return 0;
}
int leftHeight = getHeight(node->left); //左
if (leftHeight == -1) return -1; // 判断-1就返回,不要等后序才返回,省时间
int rightHeight = getHeight(node->right); //右
if (rightHeight == -1) return -1;
return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftHeight, rightHeight); //中
}
bool isBalanced(TreeNode* root) {
return getHeight(root) == -1 ? false : true;
}
};

2、257二叉树的所有路径

给你一个二叉树的根节点 root ,按任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点是指没有子节点的节点。

我的思路: 我觉得这题的关键在于路径是从root指向叶子节点,也就是从上到下,所以可以使用前序遍历。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public:
void traverse(TreeNode* root, vector<int> &path, vector<string>& res){
if(root == nullptr) return;

path.emplace_back(root->val);
if(root->left == nullptr && root->right == nullptr){ // 中
string temp;
for(int i = 0;i<path.size()-1;i++){
temp+=std::to_string(path[i])+"->";
}
temp+=std::to_string(root->val);
path.pop_back(); //回溯
res.emplace_back(temp);
return;
}
traverse(root->left,path,res);
traverse(root->right,path,res);
path.pop_back(); // 回溯
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<int> path;
vector<string> res;
traverse(root,path,res);
return res;
}
};

3、404左叶子之和

给定二叉树的根节点 root ,返回所有左叶子之和。

我的思路: 递归的第一要素就是找到截止条件,一般遍历判断当前节点是否为空指针即可,但是对于一些特殊情况,比如要求左叶子节点就必须找到父节点。
代码随想录递归三部曲:

  1. 确定递归函数的参数和返回值
  2. 确定终止条件
  3. 确定单层递归的逻辑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 我的
class Solution {
public:
int traverse(TreeNode* root){
int le = 0,ri = 0;
if(root->left != nullptr){
if(root->left->left == nullptr && root->left->right == nullptr){ //截止条件
le = root->left->val;
}else{
le = traverse(root->left);
}
}
if(root->right != nullptr){
ri = traverse(root->right);
}
return le+ri;
}
int sumOfLeftLeaves(TreeNode* root) {
if(root == nullptr)return 0;
return traverse(root);
}
};
//代码随想录
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if (root == NULL) return 0;
if (root->left == NULL && root->right== NULL) return 0;

int leftValue = sumOfLeftLeaves(root->left); // 左
if (root->left && !root->left->left && !root->left->right) { // 左子树就是一个左叶子的情况
leftValue = root->left->val;
}
int rightValue = sumOfLeftLeaves(root->right); // 右

int sum = leftValue + rightValue; // 中
return sum;
}
};

4、222完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树定义:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(从第 0 层开始),则该层包含 1~ 2h 个节点。

我的思路: 这道题第一眼看起来和求普通二叉树节点个数一样。选定返回值为当前节点以下的个数,则确定使用后序遍历
代码随想录 完全二叉树中大部分子树为满二叉树,对于满二叉树我们通过它的深度即可计算出节点个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 普通递归写法
class Solution {
public:
int countNodes(TreeNode* root) {
if(root == nullptr)return 0;
int le = countNodes(root->left);
int ri = countNodes(root->right);
return 1+le+ri;
}
};
// 看了代码随想录后写的
class Solution {
public:
int countNodes(TreeNode* root) {
if(root == nullptr)return 0;

// 截止条件:判断是不是满二叉树
TreeNode* left = root->left;
int leftdep = 0;
while(left!=nullptr){
left = left->left;
leftdep++;
}
TreeNode* right = root->right;
int rightdep = 0;
while(right!=nullptr){
right = right->right;
rightdep++;
}
if(leftdep == rightdep){
return (2 << leftdep) - 1; //注意(2<<1) 相当于2^2
}

return 1 + countNodes(root->left)+countNodes(root->right); //后序
}
};