剑指 Offer 55 - II. 平衡二叉树 + 平衡二叉树(AVL)的判断

剑指 Offer 55 - II. 平衡二叉树

Offer_55_2

题目描述

方法一:使用后序遍历+边遍历边判断

package com.walegarrett.offer;
/**
 * @Author WaleGarrett
 * @Date 2021/2/9 20:58
 */

/**
 * 题目描述:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。
 * 如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
 */

import sun.reflect.generics.tree.Tree;

/**
 * 方法一:后序遍历
 */
public class Offer_55_2 {
    public boolean isBalanced(TreeNode root) {
        return postTravel(root) != -1 ? true : false;
    }
    int postTravel(TreeNode node){
        if(node == null)//空指针高度为0
            return 0;
        int left = postTravel(node.left);
        if(left == -1)
            return -1;
        int right = postTravel(node.right);
        if(right == -1)
            return -1;
        return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;
    }
}

复杂度分析:

  • 时间复杂度 O(N): N 为树的节点数;最差情况下,需要递归遍历树的所有节点。
  • 空间复杂度 O(N): 最差情况下(树退化为链表时),系统递归需要使用 O(N) 的栈空间。

方法二:前序遍历+从上至下判断

/**
 * 方法二:前序遍历获取深度,根据深度判断当前子树是平衡二叉树
 */
class Offer_55_3 {
    public boolean isBalanced(TreeNode root) {
        if(root == null)
            return true;
        return Math.abs(depth(root.left) - depth(root.right)) < 2 && isBalanced(root.left) && isBalanced(root.right);
    }
    int depth(TreeNode node){
        if(node == null)
            return 0;
        return Math.max(depth(node.left), depth(node.right)) + 1;
    }
}

复杂度分析

posted @ 2021-02-10 13:01  Garrett_Wale  阅读(73)  评论(0编辑  收藏  举报