列出葉結點
阿新 • • 發佈:2021-02-04
問題:
對於給定的二叉樹,本題要求你按從上到下、從左到右的順序輸出其所有葉節點。
輸入格式:
首先第一行給出一個正整數 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;
}