leetcode 110 判断一棵树是否为平衡二叉树
这个题一开始我没做出来。参考网上的做法理解了。
解法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:
bool isBalanced(TreeNode* root) {
if(root==nullptr) return true;
int temp = abs(depth(root->left) - depth(root->right));
if(temp > 1) return false;
else return isBalanced(root->left) && isBalanced(root->right) ;
}
int depth(TreeNode* root)
{
if(root == nullptr) return 0;
int left = depth(root->left);
int right = depth(root->right);
return (left > right ? left : right) + 1;
}
};
解法1的问题在于重复计算了多次二叉树高度。如果将计算顺序改变下,先对子树进行递归判断,则可以直达树的最底层,一旦发现不平衡直接返回,避免了重复计算。
解法2:
class Solution {
public:
bool isBalanced(TreeNode* root) {
if(root == nullptr) return true;
if(checkDepth(root) == -1 ) return false;
else return true;
}
int checkDepth(TreeNode* node)
{
if(node == nullptr) return 0;
int left = checkDepth(node->left);
if(left == -1) return -1;
int right = checkDepth(node->right);
if(right == -1) return -1;
int diff = abs(left - right);
if(diff > 1) return -1;
return 1+max(left,right);
}
};