平衡二叉樹AVL

LingLee_荊棘鳥發表於2017-07-16

AVL:(1)空樹是平衡二叉樹

(2)所有子樹的左右子樹的高度差不超過1


(1):判斷是否為平衡二叉樹:

public class CheckBalance {
    public boolean check(TreeNode root) {
        // write code here
        if(root==null ) return true;
        if(Math.abs(getDepth(root.left)-getDepth(root.right))>1) return false;
        else return check(root.left)&&check(root.right);
    }
    
    public int getDepth(TreeNode root){//獲得樹的深度
        if(root==null) return 0;
        int left=getDepth(root.left);
        int right=getDepth(root.right);
        return Math.max(left,right)+1;
    }
}



(2)搜尋二叉樹的中序遍歷,就是從小到大的。(紅黑樹、平衡搜尋二叉樹都是讓二叉樹的調整代價較小)。判斷一個二叉樹是否為搜尋二叉樹,非遞迴的中序遍歷,當前值小於上一個節點值


(3)判斷一棵樹是否為完全二叉樹(除最後一層都是滿的,最後一層有右孩子一定有左孩子)。

按層遍歷,當前節點有右孩子卻沒左孩子---FALSE。當前節點不是左右孩子都有---後面節點必須是葉子


public class CheckCompletion {
    public boolean chk(TreeNode root) {
        // write code here
        if(root==null) return false;
        Queue<TreeNode> que=new LinkedList();
        boolean leaf=true;//false表示葉子節點
        que.add(root);
        while(!que.isEmpty()){
            TreeNode p=que.poll();
            if(p.left==null&&p.right!=null) return false;//有右孩子沒左孩子,返回FALSE
            
            if(!leaf&&(p.left!=null||p.right!=null)) return false;//左右孩子不全有,必須是葉子節點
            
            if(p.left!=null){//將左右節點新增
                que.add(p.left);
            }else{
                leaf=false;//沒有左孩子,證明其實葉子
            }
            
            if(p.right!=null){
                que.add(p.right);
            }else{
                leaf=false;//沒有右孩子,證明其是葉子節點。
            }
        }
        
        return true;
    }
    
 
}



(4)找節點的後繼節點:

方法一:中序遍歷,node後面的就是他的後繼 時間空間都是O(n)


方案二:時間O(k),k小於高度。空間原地

如果節點node有右子樹:他的後繼節點=右子樹最左邊的節點。

如果node沒有右子樹,node是左孩子:node後繼節點=node父親。

如果node沒有右子樹,node是右孩子:向上找最近的父節點p1和祖父節點p2,滿足p1是p2的左孩子,則ps是node的後繼節點。

相關文章