今天继续刷LeetCode,第110题,判断给定的一个二叉树是否是平衡二叉树。
分析:
根据平衡二叉树的定义可知,第一步是计算二叉树中节点的左右节点的深度,然后判断两者之差是否大于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:
bool isBalanced(TreeNode* root) {
if(root==NULL)
return true;
int l=height(root->left);
int r=height(root->right);
if(l<0||r<0||abs(r-l)>1)
return false;
else
return true;
}
int height(TreeNode* root){
if(root==NULL)
return 0;
int l=height(root->left);
int r=height(root->right);
if(l<0||r<0||abs(l-r)>1)
return -1;
else
return max(l,r)+1;
}
};
20190309更新
上面的方法中,每次判断一个节点是否是平衡的时候,从上到下遍历整棵树会重复计算多次深度,为了减少重复的计算部分,可以采用后序遍历的方式,在每遍历到一个节点的同时计算深度差是否平衡。