如何判斷一棵樹是不是完全二叉樹

完全二叉樹

子節點從左往右生長,一層生長完全纔可以生長下一層.

解題思路:

        橫向遍歷(按層)二叉樹的過程中,每個節點的子節點有以下四種情況:

        1-左右都沒有 : 該節點爲葉子節點

        2-左右都有: 沒啥說的,一個沒什麼幺蛾子的節點.

        3-有右沒左 : 出現這種情況直接返回false,這種情況違反完全二叉樹的定義

        4-有左沒右 : 出現此種情況,證明該節點的左節點應該是最後一層的最後一個節點,其後面遍歷到的節點都必須是葉子節點.否則該樹不是完全二叉樹.

橫向遍歷二叉樹的思路:

        將二叉樹的節點放入隊列中,彈出一個節將它的子節點先左後右壓入隊列中.直到隊列爲空.

整體代碼如下:

	public static boolean isCBT(Node head){
		if(head == null){
			return true; //空節點是完全二叉樹
		}
		Queue<Node> queue = new LinkedList<Node>();
		queue.offer(head);
		Node left = null;
		Node right = null;
		boolean isLeaf = false;
		while(!queue.isEmpty()){
			head = queue.poll();
			left = head.left;
			right = head.right;
                        //判斷是否是有右節點沒有左節點的情況 : (isLeaf && (left != null || right != null))
			//判斷出現第四種情況(有右沒左)時,後邊的節點是不是都是葉節點 : (isLeaf && (left != null || right != null))
			if((isLeaf && (left != null || right != null)) || (left == null && right != null)){
				return false;
			}
			if(head.left != null){
				queue.offer(left);
			}else if(right != null){
				queue.offer(right);
			}else{
				isLeaf = true;
			}
		}
		return true;
	}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章