判断二叉树是否平衡二叉树

题目

平衡二叉树的性质为:要么是一颗空树,要么任何一个节点的左右子树高度差的绝对值不超过1。给定一棵二叉树的头结点head,判断这棵二叉树是否为平衡二叉树。

难度:💗

基础理解

以下是个人认为对概念叙述较为详细的参考链接:

设计

概要设计

  • 设计一个初始树节点模型
  • 接收节点变量并判断是否为平衡二叉树的方法
  • 如何判断是否为平衡二叉树
    • 包含对左右各分支节点的计数器,并以此相减,是否满足绝对值 <=1 的判断方法
    • 假若左分支的左节点或右节点不满足平衡二叉树,直接退出遍历过程
  • 能改变假定 boolean 变量值的存储结构——数组

详细设计

初始树节点模型

   class Node {
        int value;
        Node left;
        Node right;

        Node(int value) {
            this.value = value;
        }
    }

布尔的判断,假定一个布尔首索引值true,通过判断平衡二叉树的具体方法将决定假定布尔值是否改变,调用该方法后,并返回布尔数组的首索引值。

    public boolean isBalance(Node node) {
        boolean[] booleans = new boolean[1];
        booleans[0] = true;
        getHeight(node, 0, booleans);
        return booleans[0];
    }

判断是否为平衡二叉树的具体方法

  • 利用自身的回调完成对节点遍历,闭包将返回值传递給变量
  • 如果(节点)左分支计数 l 减去右分支计数 r 绝对值大于1,则将数组首索引假定布尔值改变
  • 此方法的判断true或false时,所返回的整型值是多少并不重要,重要的是能否影响到假定的布尔值,这将决定整个二叉树是否为平衡二叉树
    public int getHeight(Node node, int level, boolean[] booleans) {
        if (head == null) {
            return level;
        }
        int l = getHeight(node.left, level + 1, booleans);
        int r = getHeight(node.right, level + 1, booleans);

        if (Math.abs(l - r) > 1) {
            booleans[0] = false;
        }
        return Math.max(l, r);
    }

实现

import org.junit.Test;
/**
 * @author lorem
 */
public class BalanceTreeGoTest {
    class Node {
        int value;
        Node left;
        Node right;

        Node(int value) {
            this.value = value;
        }
    }

    public boolean isBalance(Node node) {
        boolean[] booleans = new boolean[1];
        booleans[0] = true;
        getHeight(node, 0, booleans);
        return booleans[0];
    }

    public int getHeight(Node node, int level, boolean[] booleans) {
        if (node == null) {
            return level;
        }
        int l = getHeight(node.left, level + 1, booleans);
        int r = getHeight(node.right, level + 1, booleans);

        if (Math.abs(l - r) > 1) {
            booleans[0] = false;
        }
        return Math.max(l, r);
    }

    @Test
    public void test() {
        Node node = new Node(1);
        node.left = new Node(2);
        node.right = new Node(3);
        node.left.left = new Node(4);
        node.left.left.left = new Node(5);
        System.out.println(isBalance(node));
    }
}

模拟过程

以此类二叉树为例,并结合代码演示推导过程

左分支推导同理

posted @ 2018-09-29 13:03 lorem 阅读(...) 评论(...) 编辑 收藏