要求:
現給一串數字,按照順序從根插入到二叉樹中。但是插入的過程要注意,左子樹的值要小於等於父節點,右子樹的值要大於父節點。
例如,序列為1 3 4 2 3 0,插入對應的二叉樹為
1/ \
0 3
/ \
2 4\3
建好二叉樹後,從根開始輸出每行數字,每層按照從左到右的順序輸出。
輸入:
第一行為數字序列長度n(1≤n≤11)
接下來n個數字,每個數字大於等於0
輸出:
整棵二叉樹的數字。每個數字乙個換行
樣例輸入:
1 3 4 2 3 0
樣例輸出:1 0
3 24 3
hint:父節點的位置為i時,左子節點為i*2+1,右子節點為i*2+2.
先解釋一下陣列如何表示二叉樹:
乙個陣列為a[10],那麼它表示的完全二叉樹為(下面數字只表示陣列下標,不表示陣列的值)
0/ \
1 2
/ \ / \
3 4 5 6
/ \ /
7 8 9
這就是乙個陣列表示的完全二叉樹。
完全二叉樹就是除了最下面那一層外(這個圖是第四層7 8 9)前面幾層是滿二叉樹(度(子節點數)為0或2)
也就是說,我們用陣列表示二叉樹時,並不需要對陣列進行什麼操作,
只是我們意識上認為這個陣列是個二叉樹,然後按照二叉樹來處理這個陣列。
也就是陣列下標遵循二叉樹的規律。就比如左右子樹和父節點的關係。
雖然說我們這道題結果不是完全二叉樹,就像例題那樣,
但是我們可以把它想像成值全為-1的完全二叉樹,然後向-1的節點插入值。
思路分析:
由提示可以看出,這就像是乙個雜湊查詢(按照一定規則對映到陣列)
這個規則就是左子樹小於等於父節點,右子樹大於父節點。
而父節點和左右子樹下標的關係值已經給了出來。
而節點的值非負,所以我們可以將目標陣列全部賦為-1,以此來判斷目標陣列是否存有值。
所以這道題本質就是向空陣列插入資料的過程。
輸出的時候,我們需要的是值不為-1的節點
(我們建立了這個陣列,按照提示的規則插入資料,其實就是把陣列當成了完全二叉樹)
所以按照我們插入的結果,按陣列下標輸出就行。
詳細**如下。(若結果出錯,可能是target陣列開的不夠大)
11 #include2
2using
namespace
std;33
intmain()44
2121 target[j]=a[i]; //
找到位置後,賦值
2222}23
23int j=0; //
開始從頭開始找插入的數字
2424
for (int i = 0; i < n; i++) //
陣列大小為n,所以找到n個即可
2525
3030
return0;
3131 }
二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...
二叉樹,完全二叉樹,滿二叉樹
二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...