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
陣列,如果有乙個的left
和right
都是-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 個空格分隔。輸出格式 在一行...