如何只遍历一次判断一棵二叉树是否为平衡二叉树

原创 2015年11月20日 21:47:03

平衡二叉树的定义是对于二叉树中任何一个节点来说它的左子树和右子数的深度之差小于等于一。

        现在要只遍历一次判断一棵二叉树是否为平衡二叉树,这个问题可以这样分析,假设p为二叉树中的任何一个节点,f(p)表示以p为根节点的子树是否为平衡二叉树,则f(p)满足

   

1,当p不为null时,则f(p)为真,当且仅当f(pleft)为真,且f(pright)为真,且pleft和priht的深度之差小于等于1。否则f(p)为false。pleft表示p的左孩子节点,pright表示p的右孩子节点。

2,当p为null时,则f(p)为真。


由于f(p)需要返回p的深度和boolean值,将这两个值封装在一个对象里。

java代码如下,包括测试代码和核心代码

package AlgorithmTest;

/**
 * Created by dell on 2015/11/20.
 */
public class JudgeIsBalanceBinaryTreeUtil {
    public static void main(String[] args) {
        BinarySearchTree binarySearchTree = new BinarySearchTree();
        binarySearchTree.insertNode(4);
        binarySearchTree.insertNode(1);
        binarySearchTree.insertNode(5);//这个二叉排序树为二叉平衡术,因此判断应该为真
        if(JudgeBalanceBinaryTree(binarySearchTree.getRootNode())){
            System.out.println("is balanced binary tree");
        }else{
            System.out.println("not balanced binary tree");
        }
    }

    public static boolean JudgeBalanceBinaryTree(Node root){
        return isBalanceBinaryTree(root).isBalanced;
    }
    public static Result isBalanceBinaryTree(Node root){
        Result result = new Result();

        if (null == root){
            result.depth = 0;
            result.isBalanced = true;
            return result;
        }

        Result leftResult = isBalanceBinaryTree(root.nodeLeft);
        if (leftResult.isBalanced){
            Result rightResult = isBalanceBinaryTree(root.nodeRight);
            if (rightResult.isBalanced){
                int diff = leftResult.depth - leftResult.depth;
                if (diff <= 1 && diff >= -1){
                    result.isBalanced = true;
                    result.depth = 1 + (leftResult.depth > rightResult.depth ? leftResult.depth : rightResult.depth);
                    return result;
                }
            }
        }

        result.isBalanced = false;
        return result;
    }

    private static class Result{
        private boolean isBalanced;
        private int depth;

        public Result(){
            isBalanced = false;
            depth = 0;
        }
        public int getDepth() {
            return depth;
        }

        public void setDepth(int depth) {
            this.depth = depth;
        }

        public boolean isBalanced() {
            return isBalanced;
        }

        public void setIsBalanced(boolean isBalanced) {
            this.isBalanced = isBalanced;
        }
    }

}


       



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

输入一棵二叉树,判断该二叉树是否是平衡二叉树。

时间限制:1秒空间限制:32768K通过比例:36.93%最佳记录:0ms|8552K(来自  牛客688826号) 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 ...
  • wukong412
  • wukong412
  • 2015年06月11日 17:51
  • 641

【2】输入一颗二叉树判断是不是平衡二叉树

题目:输入一颗二叉树的根结点,判断该二叉树是不是平衡二叉树。平衡二叉树是满足所有结点的左右子树的高度差不超过1的二叉树 方案一:遍历数组的每一个结点,对每一个结点求它的左右子树的高度并进行判断。时...
  • cgl1079743846
  • cgl1079743846
  • 2014年05月23日 21:08
  • 2423

java 判断一个二叉树是不是平衡二叉树

题目:Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bina...
  • diu_brother
  • diu_brother
  • 2016年04月27日 17:48
  • 1948

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

输入一棵二叉树,判断该二叉树是否是平衡二叉树
  • u014282557
  • u014282557
  • 2017年06月06日 15:25
  • 1498

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

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

判断树是否为平衡二叉树

来自剑指offer 问题1:求树的深度 用递归做很简单,只要知道出口语句的别写错。 struct BinaryTreeNode { int m_Value; BinaryTreeNode* m_...
  • zhaojinjia
  • zhaojinjia
  • 2013年09月22日 11:14
  • 24358

面试题——判断一棵树是否是平衡二叉树

bool IsBlance() { return _IsBlance(_root); } protected: bool _IsBlance(Node* root) { if (roo...
  • poison_biti
  • poison_biti
  • 2016年10月25日 16:26
  • 793

剑指offer:判断二叉树是不是平衡二叉树(java)

题目:输入一棵二叉树的根节点,判断该树是不是平衡的二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。     有了求二叉树的深度的经验之后再解决这个问题,我们很容易...
  • abc7845129630
  • abc7845129630
  • 2016年10月06日 18:48
  • 3660

【Java】检查二叉树是否平衡。

实现一个函数,检查二叉树是否平衡。 二叉树平衡的定义如下:任意一个结点,其两颗子树的高度差不超过1 递归访问每个整棵树,计算每个结点子树的高度 public class BTreeBalance...
  • michellechouu
  • michellechouu
  • 2015年07月14日 10:10
  • 2412

题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树

题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如,下图中的二叉树就是一棵平衡二叉树。   解题思路: (1)需...
  • yanxiaolx
  • yanxiaolx
  • 2016年08月23日 17:05
  • 1559
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何只遍历一次判断一棵二叉树是否为平衡二叉树
举报原因:
原因补充:

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