1. 程式人生 > >二叉樹平衡判斷

二叉樹平衡判斷

平衡二叉樹:它是一棵空樹或者左右子樹的高度差絕對值不超過1,並且左右兩棵子樹都是平衡二叉樹。

要判斷一棵樹是否是平衡二叉樹,由其定義我們很容易想到通過計算出左右兩棵子樹的高度及其高度差來進行判斷。

首先,判斷當前節點是否是平衡二叉樹,則需要開始遍歷整棵樹,求其左右子樹的高度。遞迴判斷其左右子樹是否為平衡二叉樹,又一次需要遍歷其子樹求其高度。多次求其高度,越接近葉子節點的節點高度被求的次數越多。 
這種方法很容易理解,但是它的時間複雜度是O(N*N),這是一種十分低效的演算法。後面我們會貼出程式碼。

既然導致低效的原因是因為多次求了節點的高度,因此,考慮將高度放在引數列表中,在遞迴的過程中返回給上一層。 
也就是說,從葉子節點開始判斷這棵樹是否是平衡二叉樹。 
時間複雜度是O(N)


 

package erchashu_bianli;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 *
 * @author zhengchao
 */
public class PinghengErchashu {
    
    private final int[] array = { 1,2,3,4,5,6};  
    private static List<Node> nodeList = null;  
    
    //我們構建一個左拐二叉樹的資料結構,假設節點數大於2,否則肯定是平衡二叉樹。
    public  void createErChaTree() {  
        nodeList = new ArrayList<>();  
        // 將一個數組的值依次轉換為Node節點  
        for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++) {  
            nodeList.add(new Node(array[nodeIndex]));  
        }  
        // 對前lastParentIndex-1個父節點按照父節點與孩子節點的數字關係建立二叉樹  
        for (int parentIndex = 0; parentIndex < array.length - 2; parentIndex++) {  
            // 左孩子  
            nodeList.get(parentIndex).left = nodeList.get(parentIndex + 1);  
        }  
        nodeList.get(array.length - 2).left = nodeList.get(array.length - 1);  
    }  
    
    public static void main(String[] args){
        
        PinghengErchashu pingheng = new PinghengErchashu();  
        pingheng.createErChaTree();  
        
        Node root = nodeList.get(0);
        
        boolean isBalance = isBalance(root);
        System.out.println("是否是平衡二叉樹:"+isBalance);
    }
    
    
    public static boolean isBalance(Node head){
        boolean[] res = new boolean[1];
        res[0] = true;
        getHeight(head,1,res);
        return res[0];
    }
    
    public static int getHeight(Node head ,int level, boolean[] res){
        if(head == null){
            return level;
        }
        
        int lH = getHeight(head.left,level+1,res);
        if(!res[0]){
            return level;
        }
        
        int rH = getHeight(head.right,level+1,res);
        if(!res[0]){
            return level;
        }
        if(Math.abs(lH-rH)>1){
 
            res[0] = false;
        }
        return Math.max(lH, rH);
    }
    
}
 

在構建二叉樹時,我們特意構造了一個非平衡二叉樹。

執行結果:

run:
是否是平衡二叉樹:false
成功構建 (總時間: 0 秒)


 

private final int[] array = { 1,2,3,4,5,6};  

變成

private final int[] array = { 1,2};  

 

執行結果:

run:
是否是平衡二叉樹:true
成功構建 (總時間: 0 秒)