PTA 列出葉結點 25分

2021-10-25 06:24:16 字數 1699 閱讀 5686

pta 列出葉結點

題目描述:

對於給定的二叉樹,本題要求你按從上到下、從左到右的順序輸出其所有葉節點。

輸入格式:

首先第一行給出乙個正整數 n(≤10),為樹中結點總數。樹中的結點從 0 到 n−1 編號。隨後 n 行,每行給出乙個對應結點左右孩子的編號。如果某個孩子不存在,則在對應位置給出 「-」。編號間以 1 個空格分隔。

輸出格式:

在一行中按規定順序輸出葉節點的編號。編號間以 1 個空格分隔,行首尾不得有多餘空格。

輸入樣例:

8

1 -- -

0 -2 7

- -- -

5 -4 6

樣例輸出

4 1 5
這道題目呢,其實也算是一種套路,首先題目中說了從上到下,從左到右,你就應該想到,這就是層序遍歷的套路呀,如果我能夠找到層序遍歷的陣列,那麼這個問題就迎刃而解了。

首先我們要明確一點,按照題目中的輸入,根節點是肯定不會出現在這裡面的,所以我們只需要找到沒有出現的數字,然後就可以確定根節點,有了根節點,然後再模擬佇列的性質,依次把他的左孩子,右孩子插入進來,然後遍歷指標+1,繼續插入根節點的左孩子的左孩子和右孩子…

那麼問題來了,我需要用什麼樣的資料結構來儲存這些內容呢?首先我得有乙個樹結點,但是這個結點呢,他不需要資料域,只需要乙個左孩子和乙個右孩子就可以了

struct node

為什麼要這麼寫呢?因為我一會兒會建立乙個node陣列,陣列的下標就是資料域,因此只需要儲存每個結點的左右孩子就行了。

然後呢,我會用到乙個輔助陣列checked用來確定哪乙個數字沒有出現過,那就是根節點。

有了根節點,下一步我需要乙個佇列ans,首先把根節點存進去,然後從根節點開始,左孩子,右孩子,左孩子的(左孩子,右孩子),右孩子的(左孩子,右孩子)…,最後,遍歷ans陣列,如果有乙個的leftright都是-1,那麼說明這個就是葉結點。

#include

#include

using

namespace std;

struct node

;int

main()

;//檢查根節點的

for(

int i =

0;i < n;i++)if

(r ==

'-')tree[i]

.right =-1

;else

}int ans[15]

=;for(

int i =

0;i < n;i++)}

int k =1;

//注意一下,k是從 1 開始的

for(

int i =

0;i < n;i++

)int flag =0;

for(

int i =

0;i < n;i++)}

return0;

}

列出葉結點 (25 分)

對於給定的二叉樹,本題要求你按從上到下 從左到右的順序輸出其所有葉節點。首先第一行給出乙個正整數 n 10 為樹中結點總數。樹中的結點從 0 到 n 1 編號。隨後 n行,每行給出乙個對應結點左右孩子的編號。如果某個孩子不存在,則在對應位置給出 編號間以 1 個空格分隔。在一行中按規定順序輸出葉節點...

列出葉結點 25分

對於給定的二叉樹,本題要求你按從上到下 從左到右的順序輸出其所有葉節點。輸入格式 首先第一行給出乙個正整數 n 10 為樹中結點總數。樹中的結點從 0 到 n 1 編號。隨後 n 行,每行給出乙個對應結點左右孩子的編號。如果某個孩子不存在,則在對應位置給出 編號間以 1 個空格分隔。輸出格式 在一行...

列出葉結點 25分

對於給定的二叉樹,本題要求你按從上到下 從左到右的順序輸出其所有葉節點。輸入格式 首先第一行給出乙個正整數 n 10 為樹中結點總數。樹中的結點從 0 到 n 1 編號。隨後 n 行,每行給出乙個對應結點左右孩子的編號。如果某個孩子不存在,則在對應位置給出 編號間以 1 個空格分隔。輸出格式 在一行...