題目描述:
完全二叉樹的定義如下:在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1~ 2^h 個節點。
輸入:1例如此二叉樹:最低層沒有填滿,並且最下面一層的節點都集中在該層最左邊的若干位置。從圖可以看出最底層為2層,則該層最多為1~4個節點。/ \2 3
/ \ /
4 5 6輸出:6
對於任意二叉樹可以有的解法是遍歷根節點的左子樹和根節點的右子樹。最終加上根節點,就是整棵樹的節點個數,**如下:
public int countnodes(treenode root)
return countnodes(root.left) + countnodes(root.right) + 1;
}
首先需要明確完全二叉樹的定義:它是一棵空樹或者它的葉子節點只出在最後兩層,若最後一層不滿則葉子節點只在最左側。
再來回顧一下滿二叉的節點個數怎麼計算,如果滿二叉樹的層數為h,則總節點數為:2^h - 1.最底層節點數(2^(h-1)-1)。
那麼我們來對 root 節點的左右子樹進行高度統計,分別記為 left 和 right,有以下兩種結果:
left == right。這說明,左子樹一定是滿二叉樹,因為節點已經填充到右子樹了,左子樹必定已經填滿了。所以左子樹的節點總數我們可以直接得到,是 2^left - 1(左子樹是乙個滿二叉樹,根據上面公式計算),加上當前這個 root 節點,則正好是 2^left。再對右子樹進行遞迴統計。
left != right。說明此時最後一層不滿,但倒數第二層已經滿了,可以直接得到右子樹的節點個數。同理,右子樹節點 +root 節點,總數為 2^right。再對左子樹進行遞迴查詢。
關於如何計算二叉樹的層數,可以利用下面的遞迴來算,當然對於完全二叉樹,可以利用其特點,不用遞迴直接算,具體請參考最後的完整**。
/**
* definition for a binary tree node.
* public class treenode
* }*/class solution
int left = countlevel(root.left);
int right = countlevel(root.right);
if(left == right)else
}private int countlevel(treenode root)
return level;
}}
判斷乙個樹為完全二叉樹
該節點有左子樹,可以沒有有子樹,但如果有右子樹,就必須有左子樹 這裡我們可以用層序遍歷的思想,借助乙個佇列,佇列儲存的是node 將該節點入佇列,出佇列的同時將下一層自己的左右節點入佇列,設定乙個標誌位,剛開始位true,如果此時左右節點為空時,置為false,第一次為false,當第二次進來時,將...
二叉樹,完全二叉樹,滿二叉樹
二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...