题目描述
输入一棵二叉树的根结点,判断该树是不是平衡二叉树。
如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
注意:
规定空树也是一棵平衡二叉树。
样例
输入:二叉树[5,7,11,null,null,12,9,null,null,null,null]如下所示,
5
/ \
7 11
/ \
12 9
输出:true
实现思路
第一,我们要搞清楚几个概念:树的深度、一个节点的深度与高度。
第二,我们需要知道:深度是从上往下的,我们需要前序遍历。
第三,我们需要知道:高度是从下往上的,我们需要后序遍历。
最后,根节点比较特殊,树的深度,等于根节点的高度,也就是root到所有leaf的最长路径。
综上,该题目还是后序遍历。
代码实现
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 42 43 44 45 46 47 48 49 50 51 52 53
|
typedef pair<bool, int> PBI; class Solution { public: PBI dfs(TreeNode* root) { if (!root) return {true, 0};
auto lbi = dfs(root->left); if (!lbi.first) return {false, 0};
auto rbi = dfs(root->right); if (!rbi.first) return {false, 0};
if (abs(lbi.second - rbi.second) > 1) { return {false, 0}; } else { return {true, 1 + max(lbi.second, rbi.second)}; } }
int dfs(TreeNode* root) { if (!root) return 0;
int lh = dfs(root->left); int rh = dfs(root->right);
if (abs(lh - rh) > 1) { g_flag = false; return 0; }
return 1 + max(lh, rh); }
bool isBalanced(TreeNode* root) { return dfs(root).first; } };
|