1. 程式人生 > >二叉樹------平衡二叉樹 搜素二叉樹 完全二叉樹的判斷

二叉樹------平衡二叉樹 搜素二叉樹 完全二叉樹的判斷

平衡二叉樹:判斷條件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));
	}