题目描述 :
方法一:需要重复遍历节点多次解法,当遍历到一个节点时就将左右子树的的深度计算出来,然后判断是否满足条件
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//计算出每个每个节点的深度
int TreeDepth(struct TreeNode* root)
{
if(root==NULL)
return 0;
int left=TreeDepth(root->left);
int right=TreeDepth(root->right);
return (left>right)?left+1:right+1;
}
bool isBalanced(struct TreeNode* root) {
if(root==NULL)
return true;
//计算左子树的高度
int left=TreeDepth(root->left);
//计算右子树的高度
int right=TreeDepth(root->right);
//计算左右子树的高度差
int dif=abs(left-right);
//判断高度差是否超过1,若超过则返回false
if(dif>1)
return false;
//继续判断剩余节点是否满足高度平衡
return isBalanced(root->left)&&isBalanced(root->right);
}
方法二:每个节点只遍历一次,采用后序遍历的方式,我们先判断左节点,左节点的左右都满足条件我们就给它加一,然后往上一层递归返回,然后进行右节点的计算,这样最后在进行根节点的计算。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool Balanced(struct TreeNode* root,int *pdepth)
{
//若为空数直接返回
if(root==NULL){
*pdepth=0;
return true;
}
//记录左右节点深度
int left,right;
//采用后序遍历,先遍历到最左边
if(Balanced(root->left,&left)&&Balanced(root->right,&right)){
//判断左右子树是否满足条件
int dif=abs(left-right);
if(dif<=1){
//若满足条件就让自身加上子树的深度,当递归到上一层时,left和right就为左右子树高度
*pdepth=1+(left>right?left:right);
return true;
}
}
return false;
}
bool isBalanced(struct TreeNode* root) {
int pDepth=0;
return Balanced(root,&pDepth);
}