二叉樹的編號
例題 6-6 小球下落問題
有一棵二叉樹,最大深度為d,且所有葉子深度都相同。所有節點從上到下,從左到右編號為1,2,3,4,....,2^d-1。在節點1處放置小球,他會往下落。每個節點上都有乙個開關,初始全部關閉,每當有小球落到乙個開關上時,狀態都會改變,當乙個小球到達節點時,如果該節點上的開關關閉則往左走,否則往右走,直到走到葉子節點,一些小球從節點1處開始依次下落。最後乙個小球回到**呢?輸入葉子深度d,小球個數i,輸入第i個小球最後所在的葉子編號。假設i不超過整棵樹的葉子個數,d<=20。輸入最多包含1000組資料。
get
4 23 4
10 1
2 28 128
16 12345
put127
5123
25536358
#include#includeconst int maxd=20;
int s[1<>d>>i)==2)
}cout《但是,這樣做的**有乙個明顯的缺陷,那就是時間複雜度問題,運算量太大,由於i可以高達2^d-1,每組測試資料下落總層數可能會高達(2^19)*19=9961472,並且一共可能有10000組資料。
還有一種方法我們可以這樣理解,每個小球都會落到根節點上,並且前兩個小球一定必然是乙個落在左邊子樹上乙個落在右邊子樹上,一般的,只需要看小球編號的奇偶性,就能直到他最終會在那棵子樹中,對於那些落入根節點左子樹的小球來說,只需要知道該小球是第幾個落在根的左子樹,就可以直到他下一步往左還是往右了,依次類推,直到小球落到葉子上為止。
如果使用題目中給的編號i,則當i是奇數時,他是往左走的第(i+1)/2個小球,當i是偶數時,他是往右走的第i/2個小球。這樣,可以直接模擬最後乙個小球的路線,實現**:
while((cin>>d>>i)==2)
else
cout<}
C 初學記錄(樹和二叉樹)
二叉樹的編號 例題 6 6 小球下落問題 有一棵二叉樹,最大深度為d,且所有葉子深度都相同。所有節點從上到下,從左到右編號為1,2,3,4,2 d 1。在節點1處放置小球,他會往下落。每個節點上都有乙個開關,初始全部關閉,每當有小球落到乙個開關上時,狀態都會改變,當乙個小球到達節點時,如果該節點上的...
二叉樹 滿二叉樹和完全二叉樹
二叉樹是一種很重要的非線性資料結構,它是樹結構的一種重要的型別 它不是樹結構的特殊情況 其特徵是每個節點最多有兩個子樹。二叉樹的特點 二叉樹每個結點最多有 2個子結點,樹則無此限制 二叉樹中 結點的子樹 分成左子樹和右子樹,即使某結點只有一棵子樹,也要指明該子樹是左子樹,還是右子樹,就是說 二叉樹是...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...