java 判斷一棵二叉樹是否爲平衡二叉樹

題目:輸入一棵二叉樹的根節點,判斷該樹是不是平衡的二叉樹。如果某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。

    有了求二叉樹的深度的經驗之後再解決這個問題,我們很容易就能想到一個思路:在遍歷樹的每個結點的時候,調用函數TreeDepth得到它的左右子樹的深度。如果每個結點的左右子樹的深度相差不超過1,按照定義它就是一棵平衡的二叉樹。這種思路實現的代碼如下:

  1. public boolean isBalanced(BinaryTreeNode root){    
  2.        if(root ==null)    
  3.            return true;    
  4.        int left = treeDepth(root.leftNode);    
  5.        int right = treeDepth(root.rightNode);    
  6.        int diff = left - right;    
  7.        if(diff > 1 || diff <-1)    
  8.            return false;    
  9.        return isBalanced(root.leftNode) && isBalanced(root.rightNode);    
  10.    }    
     上面的代碼固然簡潔,但我們也注意到由於一個結點會被重複遍歷多次,這種思路的時間效率不高。

每個結點只遍歷一次的解法,正是面試官喜歡的算法
     如果我們用後序遍歷的方式遍歷二叉樹的每個結點,在遍歷一個結點之前我們就已經遍歷了它的左右子樹。只要在遍歷每個結點的時候我們記錄它的深度(某一節點的深度等於它到葉結點的路徑的長度),我們就可以一邊遍歷一邊判斷每個結點是不是平衡二叉樹。下面是這種思路的實現代碼:

  1. public boolean isBalanced2(BinaryTreeNode root){    
  2.        int depth = 0;    
  3.        return isBalanced2(root,depth);    
  4.    }    
  5.    public boolean isBalanced2(BinaryTreeNode root,int depth){    
  6.        if(root == null){    
  7.            depth = 0;    
  8.            return true;    
  9.        }    
  10.        int left = 0,right = 0;    
  11.        if(isBalanced2(root.leftNode,left) && isBalanced2(root.rightNode,right)){    
  12.            int diff = left-right;    
  13.            if(diff <= 1 && diff >= -1){    
  14.                depth = 1+(left > right?left : right);    
  15.                return true;    
  16.            }    
  17.        }    
  18.        return false;    
  19.    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章