天天看點

樹:平衡二叉樹

描述:

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。

在這裡,我們隻需要考慮其平衡性,不需要考慮其是不是排序二叉樹

平衡二叉樹(Balanced Binary Tree),具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,并且左右兩個子樹都是一棵平衡二叉樹。

注:我們約定空樹是平衡二叉樹。

示例

輸入:{1,2,3,4,5,6,7}

傳回值:true

思路:單獨寫一個求二叉樹深度的函數,同之前的題目。

遞歸判斷,若空樹,則為true

若左右子樹深度之差的絕對值>1,則傳回false

傳回:當對左子樹和右子樹判斷結果的與值(&&)

即:當某節點的左右子樹深度不超過1時,判斷這個節點的左右子節點分别的左右子樹深度,若有一個內插補點>1,則true&&flase結果也為false,必須兩個同時為true,通過不斷遞歸,確定每一層的子樹全都符合條件,最後的結果才為true。

//本題測試用例
//      1
//     / \
//    2   3
//   /   / \
//  4   5   6
//     / \
//    7   8
var tree = {
    value: 1,
    left: {
        value: 2,
        left: {
            value: 4
        }
    },
    right: {
        value: 3,
        left: {
            value: 5,
            left: {
                value: 7
            },
            right: {
                value: 8
            }
        },
        right: {
            value: 6
        }
    }
}

function IsBalanced_Solution(pRoot) {
    if(!pRoot) return true;
    if(Math.abs(TreeDepth(pRoot.left)-TreeDepth(pRoot.right))>1) return false;
    return IsBalanced_Solution(pRoot.left) && IsBalanced_Solution(pRoot.right)
}
function TreeDepth(node) {
    return node? Math.max(TreeDepth(node.left),TreeDepth(node.right))+1:0;
}

console.log(IsBalanced_Solution(tree));//true
           

繼續閱讀