二叉樹------平衡二叉樹 搜素二叉樹 完全二叉樹的判斷
阿新 • • 發佈:2018-11-26
平衡二叉樹:判斷條件1)左樹是否平衡2)右樹是否平衡 3)高度 左樹右樹相差高度不大於1
public static boolean isBalance(Node head){ if(head==null) return true; if(Math.abs(getHeight(head.left)-getHeight(head.right))>1) {return false;} return isBalance(head.left)&&isBalance(head.right); } public static int getHeight(Node head){ if(head==null){ return 0; } int left=getHeight(head.left); int right=getHeight(head.right); return left>right?left+1:right+1; }
完全二叉樹 :每一層從左往右沒有間斷。自己動手畫畫圖 一目瞭然
主要思路:條件一:當左子樹為空,右子樹不為空時,就返回false head.left==null&&head.right!=null
條件二:當節點非滿時,即在左子樹不為空右子樹為空 或者左右子樹都為空的情況下 要求該節點之後的節點要為葉子節點。
程式碼:用leaf 來標記是否開啟條件二,leaf=false 是代表沒有開啟 去檢查是否為葉子節點這一條件。leaf =true 則程式碼需要去檢測是否是葉子節點。
//判斷是否是完全二叉樹 public static boolean isCBT(Node head){ if(head==null){ return true; } Queue<Node> queue =new LinkedList<Node>(); boolean leaf=false; queue.add(head); while(!queue.isEmpty()){ head=queue.poll(); if((leaf&&(head.left!=null||head.right!=null))||(head.left==null&&head.right!=null)){ return false; } if(head.left!=null) queue.add(head.left); if(head.right!=null){ queue.add(head.right); }else{ leaf=true; } } return true; }
求完全二叉樹的節點個數 要求時間複雜度要低於O(N)
分析:當右子樹左邊界到達最後一層 則左子樹是滿 2^(h-level+1) -1+1+右子樹的節點數
當右子書左邊界未到達最後一層,則總節點數為2^(h-level)-1+1+左子樹的節點數。注意程式碼中的傳入的level 與此處的level值略有不同。在此過程中都應用到了遞迴思想。
public static int competeTreeNote(Node head){
if(head==null){
return 0;
}
return bs(head,1,height(head,1));
}
public static int bs(Node head, int l, int h) {
if(l==h){
return 1;
}
if(height(head.right,l+1)==h){
return (1<<(h-l))+bs(head.right,l+1,h);//此處注意括號,+優先級別比<<高
}else{
return (1<<(h-l-1))+bs(head.left,l+1,h);
}
}
public static int height(Node head,int level){
while(head!=null){
head=head.left;
level++;
}
return level-1;
}
public static void main(String[] args) {
Node node =new Node(1);
node.left=new Node(2);
node.left.left=new Node(4);
node.left.right=new Node(5);
node.left.left.left=new Node(8);
node.left.left.right=new Node(9);
node.right=new Node(3);
node.right.left=new Node(6);
node.right.right=new Node(7);
System.out.println(competeTreeNote(node));
}