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

原创 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;
        }
    }

}


       



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

相关文章推荐

数据结构(Java语言)——BinarySearchTree简单实现

二叉树的一个重要应用是它们在查找中的使用。使二叉树成为二叉查找树的性质是,对于树中的每个节点X,它的左子树中所有项的值都大于X中的项。注意,这意味着该树所有的元素都可以用某种一致的方式排序。 现在给出...

Java二叉搜索树(Binary Search Tree)实现

123

【数据结构】中判断一棵树是否为平衡二叉树

【数据结构】中判断一棵树是否为平衡二叉树

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

bool IsBlance() { return _IsBlance(_root); } protected: bool _IsBlance(Node* root) { if (roo...

如何判断一棵树是否为平衡二叉树

判断的思路很简单,若一棵树是平衡二叉树,它的左右子树都是平衡二叉树,并且左右子树的高度差小于等于1。注意,实现的时候,判断左右子树的平衡性时,可以顺便计算子树高度,不用再另外计算一次,下面是其递归实现...

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

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

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

AVL树概念:如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有N个结点,其高度可保持在O(lgn),平均搜索时间复杂度O(lg(n)). 一棵AVL树或者是空树,或者是具有以下性质的二叉搜索...

判断一棵二叉树是否为平衡二叉树

问题:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如下面就是一棵平衡二叉树。 运用递归自底向上(从叶子结...

数据结构之如何判断一棵二叉树是否是平衡二叉树(AVL树)

1. 二叉平衡树的概念    参见另一篇博客 2 如何判断一棵二叉树是平衡二叉树?    思路:        先编写计算二叉树高度的函数,然后再判断每个节点的左右子树是否相差1。    代码如下: ...

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

要求给定一棵二叉树,判断是否为平衡二叉树思路 总体思路是这样的 先分别判断左右子树是不是平衡的,若左右子树都是平衡二叉树,则判断左右子树的高度差是不是满足绝对值小于等于 1 的条件 伪代...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何只遍历一次判断一棵二叉树是否为平衡二叉树
举报原因:
原因补充:

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