编辑代码


// Solution:https://blog.csdn.net/qq_26768741/article/details/52904313

function IsBalanced_Solution(pRoot) {
    return _ibs(pRoot, { val: 0 });
}

function _ibs(pRoot, depth) {
    // 不是TreeNode类型
    if(pRoot === null || pRoot === undefined) {
        return true;	// 输入:null,输出:true
    }
    if(pRoot.left === undefined || pRoot.right === undefined) {
        return true;	// 输入:{},输出:true
    }

    // 记录左节点和右节点深度
    let l_depth = { val: 0 };
    let r_depth = { val: 0 };

    // 采取传对象方式,下层递归对深度的修改以后会影响上一层
    let l_res = false;  // 左子树的判断结果
    let r_res = false;  // 右子树的判断结果

    if(pRoot.left === null) {   // 左子树为空
        l_depth.val = 0;
        l_res = true;
    } else
        l_res = _ibs(pRoot.left, l_depth);

    if(pRoot.right === null) {  // 右子树为空
        r_depth.val = 0;
        r_res = true;
    } else
        r_res = _ibs(pRoot.right, r_depth);

    if( l_res && r_res ) {
		// console.log('['+pRoot.val+'], left: ', l_res, l_depth.val, '| right: ', r_res, r_depth.val);
        // 计算平衡因子
        let pf = Math.abs(l_depth.val - r_depth.val);
        if(pf < 2) {
            // 平衡因子小于2,则自身加上子树的深度;
            // 由于是传对象方式,当递归回到上层时,上层的l_depth.val或r_depth.val就是左/右子树的深度
            depth.val = 1 + Math.max(l_depth.val, r_depth.val);
            return true;
        }
    }

    return false;
}


// test --------------------------------------------
function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
}
function printTree(root, depth=0) {
    if(root === null || root === undefined) {
        return;
    }
    if(root.left === undefined || root.right === undefined) {
        console.log('NOT TreeNode');
		return;
    }
	
	let indent = '';
	for(let i=0; i<depth; i++) {
		indent += '--';	
	}
	console.log(indent+' ['+root.val+']');
	printTree(root.left, depth+1);
	printTree(root.right, depth+1);
	
}
function buildTree() {
    let r_8 = new TreeNode('8');
    let r_6 = new TreeNode('6');
    let r_10 = new TreeNode('10');
    let r_5 = new TreeNode('5');
    let r_7 = new TreeNode('7');
    let r_9 = new TreeNode('9');
    let r_11 = new TreeNode('11');

    r_10.right = r_11;
    r_10.left = r_9;
    r_6.right = r_7;
    r_6.left = r_5
    r_8.right = r_10;
    r_8.left = r_6;

    return r_8;
}

// let pRoot = buildTree();
let pRoot = {}; 
printTree(pRoot);
console.time('1');
let res = IsBalanced_Solution(pRoot);
console.timeEnd('1');
console.log('res:', res);

// 输入:{},输出:true