DFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public boolean isBalanced(TreeNode root) { if (root == null) { return true; }
if (Math.abs(getHeight(root.left) - getHeight(root.right)) > 1) { return false; }
return isBalanced(root.left) && isBalanced(root.right); }
private int getHeight(TreeNode root) { if (root == null) { return 0; }
return Math.max(getHeight(root.left), getHeight(root.right)) + 1; } }
|
该方法最为直观,但是效率较低。
DFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Solution { public boolean isBalanced(TreeNode root) { return dfs(root)[1] == 1; }
private int[] dfs(TreeNode root) { if (root == null) { return new int[]{0, 1}; }
int[] left = dfs(root.left); int[] right = dfs(root.right);
boolean balanced = left[1] == 1 && right[1] == 1 && Math.abs(left[0] - right[0]) <= 1; return new int[]{1 + Math.max(left[0], right[0]), balanced ? 1 : -1}; } }
|
DFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { public boolean isBalanced(TreeNode root) { return getHeight(root) != -1; }
private int getHeight(TreeNode node) { if (node == null) { return 0; }
int leftHeight = getHeight(node.left); if (leftHeight == -1) { return -1; }
int rightHeight = getHeight(node.right); if (rightHeight == -1) { return -1; }
int diff = Math.abs(leftHeight - rightHeight); if (diff > 1) { return -1; } else { return Math.max(leftHeight, rightHeight) + 1; } } }
|
自底向上计算,如果遇到不平衡的子树则及时返回。
References
110. Balanced Binary Tree
剑指 Offer 55 - II. 平衡二叉树