如何判斷一個二叉樹是否為平衡二叉樹。
阿新 • • 發佈:2019-01-29
二叉樹的知識
先回顧一下一個經典的資料結構,二叉樹。
二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(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);
}
使用上面的方法,顯而易見的是效率比較低,因為每個節點都要被遍歷多次。有興趣的可以嘗試用後序遍歷來判斷。