1. 程式人生 > 其它 >列出葉結點

列出葉結點

技術標籤:佇列二叉樹資料結構演算法連結串列

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

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

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

輸入樣例:
8
1 -

0 -
2 7

5 -
4 6

輸出樣例:
4 1 5

思路:
先找根結點,根結點不為任何結點的子結點,遍歷一次,不是葉子結點的,就是根結點。

然後從根結點開始,上到下,左到右遍歷查詢沒有子葉(沒有左右子夜即為子葉)

程式碼思路:
第一步:從鍵盤輸入i結點的左右子葉,用pair儲存,frist為左子葉,second為右子葉,並用陣列記錄該結點是否為子葉
第二步:廣度搜索,定義佇列,將上到下,左到右的結點分別放入佇列,順序查詢
第三步:將沒有左右子葉的元素輸出,有子葉的子葉部分存入佇列
第四步:刪除佇列已遍歷結點

程式碼:

#include<iostream>
#include<stack>
#include<queue>
const int Max = 15;
using namespace std;
int main() { pair<int, int> p[Max];//pair將一對值(T1和T2)組合成一個值,用pair的兩個公有函式first和second訪問。 int hash[Max] = {0};//記錄每個結點的左右子葉,空為-1,不空為1,hash記錄該結點是子葉否為子葉 int n; cin>>n; if(n == 0) { cout<<endl; return 0;} char a,b; for(int i = 0; i < n; i++) { cin>>
a>>b; if(a != '-') { p[i].first = a - '0'; hash[a - '0'] = 1; } else { p[i].first = -1; } if(b != '-') { p[i].second = b - '0'; hash[b - '0'] = 1; } else { p[i].second = -1; } } queue<int> q; for(int i = 0; i < n; i++) {//遍歷查詢根結點 if(hash[i]) continue; q.push(i); break; } int count; int t = 0; while(!q.empty()) {//從根結點開始上到下查詢左右結點 count = 0;//該結點下有幾個子葉 if(p[q.front()].first != -1) { q.push(p[q.front()].first);//非葉結點將該元素存入佇列中 count++; } if(p[q.front()].second != -1) { q.push(p[q.front()].second);//非葉結點將該元素存入佇列中 count++; } if(!count) {//沒有子葉也就代表該元素為當前上一結點的子葉,即為葉結點 if(t) cout<<' '<<q.front(); else { cout<<q.front(); t = 1; } } q.pop();//刪除遍歷的結點 } return 0; }