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

题目

平衡二叉树的性质为:要么是一颗空树,要么任何一个节点的左右子树高度差的绝对值不超过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));
    }
}

模拟过程

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

左分支推导同理

原文地址:https://www.cnblogs.com/loremwalker/p/9723168.html

时间: 2024-08-19 03:24:31

判断二叉树是否平衡二叉树的相关文章

56. 2种方法判断二叉树是不是平衡二叉树[is balanced tree]

[本文链接] http://www.cnblogs.com/hellogiser/p/is-balanced-tree.html [题目] 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树.例如下图中的二叉树就是一棵平衡二叉树: [分析] 之前的博文27.二元树的深度[BinaryTreeDepth]中介绍过如何求二叉树的深度.有了经验之后再解决这个问题,我们很容易就能想到思路. [方案1] 先判断左右子树是不是平衡的

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

题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树.某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵二叉树. 我们很容易就能想到一个代码简洁却性能不佳的思路:在遍历树的每个结点的时候,调用函数TreeDpth得到它的左右子树的深度.如果每个结点的左右子树的深度相差都不超过1,按照定义它就是一棵平衡的二又树. 较好的思路是:用后序遍历的方式遍历整棵二叉树.在遍历某结点的左右子结点之后,我们可以根据它的左右子结点的深度判断它是不是平衡的,并得到当前结点的深度.当最后遍历到树的根结点

判断一棵二叉树是不是平衡二叉树

二叉树中任意左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 两种解法. 第一种:菜鸟的解法,出现重复遍历,时间复杂度高. 1 bool IsBalanced(BinaryTreeNode* root) 2 { 3 if (root == NULL) 4 { 5 return true ; 6 } 7 int left = TreeDepth(root->m_pLeft);//该函数实现见我上一篇博客"数的深度" 8 int right = TreeDepth(root-&

C++算法之 判断是否为平衡二叉树 求二叉树的镜像

1:判断是否为平衡二叉树: //方法1: int TreeDepth(BTree* pRoot) { if (pRoot == NULL) return 0; int nLeftDepth = TreeDepth(pRoot->m_pLeft); int nRightDepth = TreeDepth(pRoot->m_pRight); return (nLeftDepth > nRightDepth)? (nLeftDepth+1):(nRightDepth+1); } bool Is

【算法】如何判断一个二叉树是平衡二叉树

题目:如何判断一个二叉树是平衡二叉树 定义: 平衡二叉树(AVL):1.空二叉树是AVL树: 2.如果T是一颗非空的二叉搜索树,TL和TR分别是其左子树和右子树,那么当T满足一下条件时,T是一颗AVL树:(1)TL和TR是AVL树:(2)|HL-HR|<=1,HL和HR分别是左子树和右子树的高度 示例: 算法思想: 采用递归的思想,从root节点进行递归的调用.假设叶子节点的高度是0,分别计算各个节点的左右子树的高度差:若高度差大于1则返回-1(表示不是平衡树)否则返回子树的最大高度加一. 时间

判断二叉树是否平衡

题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 注:这里不考虑该二叉树是否是二叉排序树 解决要点: 1.后序遍历二叉树: 2.递归. 核心算法: bool isBalanced(pTree pT,int *depth) { if(!pT)//参数判断 { *depth = 0; return true; } //后序遍历 int left,right; if(isBalanced(pT->lChild,&

编程算法 - 判断二叉树是不是平衡树 代码(C)

判断二叉树是不平衡树 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一颗二叉树的根结点, 判断该树是不是平衡二叉树. 二叉平衡树: 任意结点的左右子树的深度相差不超过1. 使用后序遍历的方式, 并且保存左右子树的深度, 进行比较. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <std

《剑指offer》:[39-1]判断是否为平衡二叉树

题目:输入一棵二叉树的结点,判断该树是不是平衡二叉树.如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 上图中的二叉树就是一棵平衡二叉树. 分析:有了求二叉树深度的思路后,我们很快就能找到求解该问题的方法,就是从根结点开始开始判断其左右子结点的深度之差是否为1.如果从根结点开始到叶子结点的每一个结点的左右子树的深度相差都不超过1,则说明该二叉树是平衡二叉树.但是其时间复杂度接近O(N*N),因为里面有重复的遍历和访问.例如我们在判断8这个根结点是否是平衡的时候,我们

二叉树、平衡二叉树、完全二叉树、满二叉树 .

基本概念 结点的层次(Level)从根开始定义,根为第一层,根的孩子为第二层. 二叉树的高度:树中结点的最大层次称为树的深度(Depth)或高度. 二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用作二叉查找树和二叉堆.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的(i