您的位置:首页 > 理论基础 > 数据结构算法

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

2016-09-08 09:10 309 查看

二叉树的知识

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

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


使用上面的方法,显而易见的是效率比较低,因为每个节点都要被遍历多次。有兴趣的可以尝试用后序遍历来判断。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息