二叉树的知识
先回顾一下一个经典的数据结构,二叉树。
二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(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);
}
使用上面的方法,显而易见的是效率比较低,因为每个节点都要被遍历多次。有兴趣的可以尝试用后序遍历来判断。