劍指offer之平衡二叉樹
阿新 • • 發佈:2018-10-31
1.題目描述
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。
2.問題分析
什麼是平衡二叉樹?平衡二叉搜尋樹(Self-balancing binary searchtree)又被稱為AVL樹(有別於AVL演算法),且具有以下性質:它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。
根據平衡二叉樹的定義,我們可以知道,平衡二叉樹也是一個遞迴定義。我們可以借鑑二叉樹的深度來判斷是否是平衡二叉樹。
每次我們得到左右子樹高度的時候,都進行高度差判斷。如果有一個子樹不滿足要求,之後都返回一個標誌值,說明該樹不是平衡二叉樹。
3.原始碼
int getDeep(TreeNode* pRoot)
{
if(pRoot == NULL)
return 0;
int left = getDeep(pRoot->left);
//如果左樹非平衡二叉樹,直接返回結果
if(left == -1)
return -1;
int right = getDeep(pRoot->right);
//如果右樹非平衡二叉樹,直接返回結果
if(right == -1)
return -1;
//判斷左右子樹是否滿足平衡二叉樹要求,不滿足就返回-1,反之返回平衡二叉樹高度
return std::abs(left - right) > 1 ? -1 : max(left, right) + 1;
}
bool IsBalanced_Solution(TreeNode* pRoot) {
//如果pRoot為空,因為返回值是0,所以也是平衡二叉樹
return getDeep(pRoot) != -1;
}