计算二叉树的深度,判断二叉树是否是平衡二叉树

原创 2015年07月07日 20:49:50
package java_study.JianZhiOffer;

import org.junit.Test;

/**
 * Created by ethan on 2015/7/7.
 * 剑指offer No39计算二叉树的深度,判断二叉树是否是平衡二叉树
 */
public class No39二叉树的深度 {

    public int getDepth(TreeNode root){
        if (root == null) return 0;
        int left = getDepth(root.getLchild());
        int right = getDepth(root.getRchild());
        return (left>right?left:right)+1;
    }
    // 判断平衡二叉树的方法1: 先序的方法,这样重复遍历了
    public boolean isBalanceBinaryTree(TreeNode root){
        if (root==null) return true;
        int left = getDepth(root.getLchild());
        int right = getDepth(root.getRchild());
        int gap = left - right;
        if (Math.abs(gap)<=1){
            return isBalanceBinaryTree(root.getLchild()) && isBalanceBinaryTree(root.getRchild());
        }else
            return false;
    }
    // 判断平衡二叉树的方法2: 后序的方法,这样就不需要重复遍历了
    // 但是这样就要在根节点和子节点传递深度,如果用c/c++的指针实现比较简单,用java实现实在是ugly
    public class Depth{
        int depth;
    }
    public boolean isBanlanceBinaryTreePost(TreeNode root){
        return isBanlanceBinaryTreePostImp(root, new Depth());
    }
    public boolean isBanlanceBinaryTreePostImp(TreeNode root, Depth d){
        if (root==null) {
            d.depth = 0;
            return true;
        }
        Depth d_left = new Depth();
        Depth d_right = new Depth();
        if (isBanlanceBinaryTreePostImp(root.getLchild(), d_left) && isBanlanceBinaryTreePostImp(root.getRchild(), d_right)){
            int gap = d_left.depth - d_right.depth;
            if (Math.abs(gap)<=1){
                d.depth = ((d_left.depth>d_right.depth)?d_left.depth:d_right.depth)+1;
                return true;
            }
        }
        return false;
    }

    @Test
    public void test(){
        TreeNode root = TreeUtil.buildTree("478321", "872341");
        TreeUtil.postOrder(root);
        System.out.println();
        System.out.println(getDepth(root));
        System.out.println(isBalanceBinaryTree(root));
        System.out.println(isBanlanceBinaryTreePost(root));
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

二叉树的深度,判断是否是平衡二叉树

二叉树的深度,判断是否是平衡二叉树

AVL树详解&面试题-判断一棵树是否是平衡二叉树

上次写了关于二叉搜索树的分析,但是二叉搜索树有一个缺陷,就是当插入一个有序(或接近有序)的序列时,二叉搜索树就相当于一个链表了,搜索效率会特别低。那么,如何来改进呢?这就引入了AVL树(高度平衡二叉树...

求二叉树深度、判断是否是平衡二叉树

求二叉树深度:递归的方法:从根节点按照先序顺序遍历二叉树,返回左子树和右子树中较大的深度,再加上1就是根节点的深度。C++代码实现:typedef struct TreeNode{ int d...

判断二叉查找树是否是平衡二叉树(代码)

递归解法: (1)如果二叉树为空,返回真 (2)如果二叉树不为空,如果左子树和右子树都是AVL树并且左子树和右子树高度相差不大于1,返回真,其他返回假参考代码: /****************...

二叉树的深度求值和判断是否是平衡

#ifndef BINTREE_H #define BINTREE_H #include #include #include using namespace std; template ...

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

一,问题描述 任意给定一棵二叉树,判断它是否是平衡二叉树。所谓平衡二叉树,是指二叉树中任意一个结点的左右子树的高度之差不超过1   二,思路分析 可以分两步实现。第一步先实现求...

笔试面试算法经典--判断二叉树是否是平衡二叉树(Java)

平衡二叉树(Balanced Binary Tree)又被称为AVL树,且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。如下面的三棵树:只...

【算法】判断一颗二叉树是否是平衡二叉树

1.问题描述:   判断一颗二叉树是否是平衡二叉树。 2.问题分析:   平衡二叉树要求左子树和右子树的高度相差为1,且左右子树都是平衡二叉树,显然需要计算二叉树高度的函数。 3.代码: templa...

数据结构面试题/判断一棵二叉树是否是平衡二叉树

AVL树概念:如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有N个结点,其高度可保持在O(lgn),平均搜索时间复杂度O(lg(n)). 一棵AVL树或者是空树,或者是具有以下性质的二叉搜索...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)