题意
给一个二叉树,判断是否平衡
思路
dfs即可。
对于一个节点,我们需要求出其左右子树的高度,然后判断是高度差是否小于等于1。
但是注意的是如果从上往下做,每次求一下高度,时间复杂度会上升到 O(n2) ,因此需要从下往上做。并且,若对于一个节点,其左右子树中一个不平衡,那么就直接返回不平衡。
算法1是用一个pair<int, bool>
:其中第一维代表当前节点的高度,第二维表示以该节点为根节点的子树是否平衡。
算法2为了简化pair
,直接用-1来代表子树不平衡
代码
算法1
/**
* 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:
pair<int, bool> dfs(TreeNode* root) {
if (!root) return make_pair(0, true);
pair<int, bool> lp = dfs(root->left);
pair<int, bool> rp = dfs(root->right);
int diff = abs(lp.first - rp.first);
if (diff <= 1 && lp.second && rp.second) return make_pair(max(lp.first, rp.first) + 1, true);
return make_pair(max(lp.first, rp.first) + 1, false);
}
bool isBalanced(TreeNode* root) {
return dfs(root).second;
}
};
算法2
/**
* 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 dfs(TreeNode* root) {
if (!root) return 0;
int lh = dfs(root->left);
int rh = dfs(root->right);
if (lh != -1 && rh != -1) return abs(lh - rh) <= 1 ? max(lh, rh) + 1 : -1;
return -1;
}
bool isBalanced(TreeNode* root) {
return dfs(root) != -1;
}
};