1. 程式人生 > >如何判斷一個二叉樹是否為平衡二叉樹。

如何判斷一個二叉樹是否為平衡二叉樹。

二叉樹的知識

先回顧一下一個經典的資料結構,二叉樹。

二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(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); }

使用上面的方法,顯而易見的是效率比較低,因為每個節點都要被遍歷多次。有興趣的可以嘗試用後序遍歷來判斷。