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

二叉树的知识

先回顾一下一个经典的数据结构,二叉树。

二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。

平衡二叉树:一棵二叉树中每个节点的两个子树的深度相差不会超过1。

下面我们先用java定义一个树的结构。

    public class TreeNode {
        private int val;
        private TreeNode left,right;
        public TreeNode(val)
        {
            this.val=val;
            this.left=this.right=null;
        }
    }

那么如何判断一个二叉树是否平衡二叉树?

我们可以遍历每一个节点,然后计算出它的左子树,和右子树的深度,然后判断。


//计算树的高度
public int getTreeHeight(TreeNode root)
    {
        if(root==null)//为空,返回0
        {
            return 0;
        }
        int height=1;

        if(root.left!=null)//左子树不为空则递归调用计算出左子树的深度
        {
            height = 1+getTreeHeight(root.left); 
        }
        if(root.right!=null)//右子树不为空则递归调用计算出右子树的深度
        {
           int h = 1+getTreeHeight(root.right);  
           height = height>h?height:h; //比较左右子树得出树的深度
        }

        return height;
    }
     //判断是否为平衡二叉树
     public boolean isBalanced(TreeNode root) {
        // write your code here
        if(root==null)
        {
            return true;
        }
        int left=getTreeHeight(root.left);
        int right=getTreeHeight(root.right);
        int diff=left-right;

        if(diff>1||diff<-1)//相差高度绝对值不大于1则为平衡二叉树
        {
            return false;
        }
        //必须判断每个节点
        return isBalanced(root.left)&&isBalanced(root.right);  
    }

使用上面的方法,显而易见的是效率比较低,因为每个节点都要被遍历多次。有兴趣的可以尝试用后序遍历来判断。

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/cst_code/article/details/52467762
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞