剑指Offer_55_二叉树的深度
廖家龙 用心听,不照做

❗️LeetCode_104_二叉树的最大深度

题目1描述:

1
2
3
4
5
6
7
8
9
10
11
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。

给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。

提示:节点总数 <= 10000

解法1:递归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode* root) {

if (root == NULL) return 0;

int nLeft = maxDepth(root -> left);
int nRight = maxDepth(root -> right);

return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
}
};

❗️LeetCode_110_平衡二叉树

题目2描述:平衡二叉树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

示例:

给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回 true 。

给定二叉树 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/ \
4 4
返回 false 。

限制:0 <= 树的结点个数 <= 10000

解法1:需要重复遍历节点多次的解法

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
41
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:

//求二叉树的深度
int maxDepth(TreeNode* root) {

if (root == NULL) return 0;

int nLeft = maxDepth(root->left);
int nRight = maxDepth(root->right);

return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
}

bool isBalanced(TreeNode* root) {

if (root == NULL) return true;

int left = maxDepth(root->left);
int right = maxDepth(root->right);

int diff = left - right;
if (diff > 1 || diff < -1) return false;

//需要重复遍历节点多次的解法
return isBalanced(root->left) && isBalanced(root->right);

//注意不能直接return true,这样只是判断了根节点是平衡二叉树,实际上必须根节点的每个子节点都要是平衡二叉树
//层序遍历:[1,2,2,3,null,null,3,4,null,null,4]
//return true;
}
};

解法2:每个节点只遍历一次的解法

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
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isBalanced(TreeNode* root) {

int depth = 0;
return Balanced(root,&depth);
}

//每个节点只遍历一次的解法
//如果我们用后序遍历的方式遍历二叉树的每个节点,那么在遍历到一个节点之前我们就已经遍历了它的左、右子树
//只要在遍历每个节点的时候记录它的深度,我们就可以一边遍历一边判断每个节点是不是平衡的
bool Balanced(TreeNode* pRoot,int *pDepth) {

if (pRoot == NULL) {
*pDepth = 0; //❗️注意这一行不可以去掉,会出错
return true;
}

int left,right;
if (Balanced(pRoot->left,&left) && Balanced(pRoot->right,&right)) {

int diff = left - right;
if (diff <= 1 && diff >= -1) {
*pDepth = 1 + (left > right ? left : right);
return true;
}
}
return false;
}
};