题目分析:[[EVD]] - 剑指 Offer 55 - II. 平衡二叉树https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/
简单描述:
- 判断二叉树是不是平衡二叉树(某二叉树中任意节点的左右子树的深度相差不超过1)
限制🚫
- 0 <= 树的结点个数 <= 10000
示例:
3
/ \
9 20
/ \
15 7
输入:[3,9,20,null,null,15,7]
输出:true1
/ \
2 2
/ \
3 3
/ \
4 4
输入:[1,2,2,3,3,null,null,4,4]
输出:false
解题思路:
思路:
- #DFS #BFS 树深=max(根的左子树,根的右子树)+1, 比较各个节点的左右子树高度差,先序遍历存在大量重复的深度计算,可用后序遍历优化以下,也有人使用哈希表去省略重复的计算
效率:
- 空间复杂度
- 先序遍历+判断深度(自顶向下) 时间复杂度
- 后序遍历 + 剪枝(从底至顶) 时间复杂度
代码:
- 1.先序遍历+判断深度(自顶向下)
class Solution
{
public:
/*先序遍历+判断深度(自顶向下)*/
bool isBalanced(TreeNode *root)
{
if (root == NULL)
return true; //空树为平衡数
return abs(dfs(root->left) - dfs(root->right)) <= 1 && isBalanced(root->left) && isBalanced(root->right);
}
int dfs(TreeNode *root)
{
if (root == NULL)
return 0;
return max(dfs(root->left), dfs(root->right)) + 1;
}
};
- 2.后序遍历 + 剪枝(从底至顶)
class Solution
{
public:
/*后序 + 剪枝*/
bool isBalanced(TreeNode *root)
{
return dfs(root) != -1;
}
int dfs(TreeNode *root)
{
if(root == nullptr) return 0;
int left = dfs(root->left);
if(left == -1) return -1;
int right = dfs(root->right);
if(right == -1) return -1;
return abs(right - left) <= 1? max(left,right)+1 : -1/*不平衡标志,和0终止作区分*/;
}
};