陣列二叉樹

2022-03-01 08:46:58 字數 1790 閱讀 5373

要求:

現給一串數字,按照順序從根插入到二叉樹中。但是插入的過程要注意,左子樹的值要小於等於父節點,右子樹的值要大於父節點。

例如,序列為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陣列開的不夠大)

1

1 #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個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...