平衡二叉树的定义

    根节点的左子树与右子树的高度差不能超过1 这棵二叉树的每个子树的符合第一条

    图例
    image.png
    图中这个就可以称为平衡二叉树

    不是平衡二叉树的示意图如下
    image.png
    上图中 子节点b的左子树深度为2 右子树的深度为0 ,不满足条件不是一个平衡二叉树
    使用代码实现

    1. class Node {
    2. constructor(value) {
    3. this.value = value;
    4. this.left = null;
    5. this.right = null;
    6. }
    7. }
    8. let a = new Node('a');
    9. let b = new Node('b');
    10. let c = new Node('c');
    11. let d = new Node('d');
    12. let e = new Node('e');
    13. let f = new Node('f');
    14. let g = new Node('g');
    15. let h = new Node('h');
    16. let i = new Node('i');
    17. a.left = b;
    18. b.left = d;
    19. d.left = h;
    20. e.left = i;
    21. c.left = f;
    22. a.right = c;
    23. c.right = g;
    24. b.right = e;
    25. /**
    26. * 判断是否为平衡二叉树
    27. * 平衡二叉的满足条件
    28. * 根节点的左子树与右子树的高度差不能超过1
    29. * 这棵二叉树的每个子树的符合第一条
    30. * @param {*} root 节点
    31. * @returns Boolean
    32. */
    33. function isBalanceTree(root) {
    34. if(!root) return true;
    35. let letTree = getDeep(root.left)
    36. let rightTree = getDeep(root.right)
    37. if(Math.abs(letTree - rightTree) > 1) return false
    38. else return isBalanceTree(root.left) && isBalanceTree(root.right);
    39. }
    40. /**
    41. * 获取二叉树的深度
    42. * @param {*} root 节点
    43. * @returns Number 返回左右子树的最深的层数
    44. */
    45. function getDeep(root) {
    46. if(!root) return 0 ;
    47. let leftTree = getDeep(root.left);
    48. let rightTree = getDeep(root.right);
    49. return Math.max(leftTree,rightTree) + 1;
    50. }
    51. let root = isBalanceTree(a)
    52. console.log(root)