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

来源:互联网 发布:网络销售卖红酒好不好 编辑:程序博客网 时间:2024/05/03 05:55

二叉树的知识

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

二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(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);      }

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

0 0
原创粉丝点击