110. 平衡二叉树

  1. class Solution {
  2. /**
  3. * 递归法
  4. */
  5. public boolean isBalanced(TreeNode root) {
  6. return getHeight(root) != -1;
  7. }
  8. /**返回二叉树的最大高度
  9. */
  10. private int getHeight(TreeNode root) {
  11. if (root == null) {
  12. return 0;
  13. }
  14. int leftHeight = getHeight(root.left);
  15. if (leftHeight == -1) {
  16. return -1;
  17. }
  18. int rightHeight = getHeight(root.right);
  19. if (rightHeight == -1) {
  20. return -1;
  21. }
  22. // 左右子树高度差大于1,return -1表示已经不是平衡树了
  23. if (Math.abs(leftHeight - rightHeight) > 1) {
  24. return -1;
  25. }
  26. return Math.max(leftHeight, rightHeight) + 1;
  27. }
  28. }
class Solution {
   /**
     * 迭代法,效率较低,计算高度时会重复遍历
     * 时间复杂度:O(n^2)
     */
    public boolean isBalanced(TreeNode root) {
        if (root == null) {
            return true;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode pre = null;
        while (root!= null || !stack.isEmpty()) {
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            TreeNode inNode = stack.peek();
            // 右结点为null或已经遍历过
            if (inNode.right == null || inNode.right == pre) {
                // 比较左右子树的高度差,输出
                if (Math.abs(getHeight(inNode.left) - getHeight(inNode.right)) > 1) {
                    return false;
                }
                stack.pop();
                pre = inNode;
                root = null;// 当前结点下,没有要遍历的结点了
            } else {
                root = inNode.right;// 右结点还没遍历,遍历右结点
            }
        }
        return true;
    }

    /**
     * 层序遍历,求结点的高度
     */
    public int getHeight(TreeNode root) {
        if (root == null) {
            return 0;
        }
        Deque<TreeNode> deque = new LinkedList<>();
        deque.offer(root);
        int depth = 0;
        while (!deque.isEmpty()) {
            int size = deque.size();
            depth++;
            for (int i = 0; i < size; i++) {
                TreeNode poll = deque.poll();
                if (poll.left != null) {
                    deque.offer(poll.left);
                }
                if (poll.right != null) {
                    deque.offer(poll.right);
                }
            }
        }
        return depth;
    }
}