題目描述:
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。
實現如下:
//如果二叉樹中的任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹
//利用對二叉樹的後序遍歷,自底向上的判斷是否爲平衡二叉樹
//若某一結點不滿足條件,則此樹不是平衡二叉樹
//若某一結點滿足條件,就要計算此結點的深度,爲後面的計算做準備
class Solution
{
public:
bool IsBalanced(TreeNode* pRoot, int &depth)
{
if (pRoot == NULL)
{
depth = 0;
return true;
}
int leftChildDepth = 0;//記錄當前結點的左子樹深度
int rightChildDepth = 0;//記錄當前結點的右子樹深度
//如果當前結點的左右子樹都滿足平衡時
if (IsBalanced(pRoot->left, leftChildDepth) && IsBalanced(pRoot->right, rightChildDepth))
{
int high = leftChildDepth - rightChildDepth;//計算當前結點的左右高度差
if (high >= -1 && high <= 1)//如果依舊平衡
{
depth = 1 + (leftChildDepth >= rightChildDepth ? leftChildDepth : rightChildDepth);//計算此結點的深度
return true;
}
}
return false;//此時此結點不滿足平衡條件
}
bool IsBalanced_Solution(TreeNode* pRoot)
{
int depth = 0;//記錄每一個結點的深度
return IsBalanced(pRoot, depth);//開始遞歸,進行後序遍歷
}
};