|
| 1 | +# No.110 平衡二叉树 |
| 2 | + |
| 3 | +给定一个二叉树,判断它是否是高度平衡的二叉树。 |
| 4 | + |
| 5 | +本题中,一棵高度平衡二叉树定义为: |
| 6 | + |
| 7 | +一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 |
| 8 | + |
| 9 | +## 示例 |
| 10 | + |
| 11 | +示例 1: |
| 12 | + |
| 13 | +给定二叉树 [3,9,20,null,null,15,7] |
| 14 | + |
| 15 | + 3 |
| 16 | + / \ |
| 17 | + 9 20 |
| 18 | + / \ |
| 19 | + 15 7 |
| 20 | +返回 true 。 |
| 21 | + |
| 22 | +示例 2: |
| 23 | + |
| 24 | +给定二叉树 [1,2,2,3,3,null,null,4,4] |
| 25 | + |
| 26 | + 1 |
| 27 | + / \ |
| 28 | + 2 2 |
| 29 | + / \ |
| 30 | + 3 3 |
| 31 | + / \ |
| 32 | + 4 4 |
| 33 | +返回 false 。 |
| 34 | + |
| 35 | +## 解题思路 |
| 36 | + |
| 37 | +### 1、自顶向下发 |
| 38 | + |
| 39 | +遍历每一个节点,计算节点的左右子树高度。 |
| 40 | + |
| 41 | +```javascript |
| 42 | +var isBalanced = function(root) { |
| 43 | + if (root == null) return true; |
| 44 | + return (Math.abs(leftHeight(root) - rightHeight(root)) <= 1) && isBalanced(root.left) && isBalanced(root.right) |
| 45 | +}; |
| 46 | + |
| 47 | +var leftHeight = function(node) { |
| 48 | + if (!node) return 0; |
| 49 | + return height(node.left) + 1; |
| 50 | +} |
| 51 | + |
| 52 | +var rightHeight = function(node) { |
| 53 | + if (!node) return 0; |
| 54 | + return height(node.right) + 1; |
| 55 | +} |
| 56 | + |
| 57 | +var height = function(node) { |
| 58 | + return Math.max(leftHeight(node), rightHeight(node)); |
| 59 | +} |
| 60 | +``` |
| 61 | + |
| 62 | +### 2、自底向上 |
| 63 | + |
| 64 | +对二叉树做深度优先遍历DFS,递归过程中,当我们发现有一例 左/右子树高度差 > 1 的情况时,代表此树不是平衡树,返回-1; |
| 65 | +当发现不是平衡树时,后面的高度计算都没有意义了,因此一路返回-1,避免后续多余计算。 |
| 66 | +最差情况是对树做一遍完整DFS,时间复杂度为 O(N)。 |
| 67 | + |
| 68 | +```javascript |
| 69 | +var isBalanced = function(root) { |
| 70 | + return depth(root) != -1; |
| 71 | +}; |
| 72 | + |
| 73 | +var depth = function(root) { |
| 74 | + if (!root) return 0; |
| 75 | + let left = depth(root.left); |
| 76 | + if (left == -1) return -1; |
| 77 | + let right = depth(root.right); |
| 78 | + if (right == -1) return -1; |
| 79 | + return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1; |
| 80 | +} |
| 81 | +``` |
0 commit comments