【两种解法】基础实验4-2.2 列出叶结点 (25 分)
生活随笔
收集整理的這篇文章主要介紹了
【两种解法】基础实验4-2.2 列出叶结点 (25 分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
立志用最少的代碼做最高效的表達
對于給定的二叉樹,本題要求你按從上到下、從左到右的順序輸出其所有葉節點。
輸入格式:
首先第一行給出一個正整數 N(≤10),為樹中結點總數。樹中的結點從 0 到 N?1 編號。隨后 N 行,每行給出一個對應結點左右孩子的編號。如果某個孩子不存在,則在對應位置給出 “-”。編號間以 1 個空格分隔。
輸出格式:
在一行中按規定順序輸出葉節點的編號。編號間以 1 個空格分隔,行首尾不得有多余空格。
輸入樣例:
8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6
輸出樣例:
4 1 5
步驟:
1、按行建樹。 因為節點少,因此可以采用數組模擬建樹的方式,即偽建樹。
2、將所有節點的出現記錄在數組中,遍歷,若某值沒出現,則一定為根。
3、dfs或隊列遍歷樹,存儲并輸出節點。
總結:
1、對于簡單的建樹工程,可以采用數組偽建樹的方法
2、對于按順序輸出葉節點,可以采用兩種方法
??1、采用dfs深度優先搜索,同時將層數加入遞歸遍歷
??2、采用隊列層序遍歷輸出。
DFS解法
#include<iostream> #include<vector> #include<cstring> using namespace std;struct node{char left, right; }nd[15];vector<int>leaf[15]; void dfs(int s, int cur) { //cur是層數 if(nd[s].left == '-' && nd[s].right == '-') {leaf[cur].push_back(s); //記錄葉節點 return;}if(nd[s].left != '-') dfs(nd[s].left - '0', cur + 1); //左遍歷 if(nd[s].right != '-') dfs(nd[s].right - '0', cur + 1); }int main() {int n, root[10], rt = 0;memset(root, 0, sizeof(root));cin >> n;for(int i = 0; i < n; i++) {cin >> nd[i].left >> nd[i].right;root[nd[i].left-'0'] = root[nd[i].right-'0'] = 1; //判斷根 }for(int i = 0; i < n; i++) //求根節點 if(!root[i]) {rt = i;break;}dfs(rt, 1);bool f = false;for(int i = 1; i <= 10; i++) {for(int j = 0; j < leaf[i].size(); j++) {if(f) cout << ' ';else f = true;cout << leaf[i][j];}}return 0; }隊列解法
#include<iostream> #include<vector> #include<cstring> #include<queue> using namespace std;struct node{char left, right; }nd[15];queue<int>fin; void Stack(int s) {queue<int>q;q.push(s);while(!q.empty()) {int x = q.front();q.pop();bool flag = false;if(nd[x].left != '-') { q.push(nd[x].left - '0'); flag = true; }if(nd[x].right != '-') { q.push(nd[x].right - '0'); flag = true; }if(flag == false) fin.push(x); //如果無左無右,則一定為葉,保存。 } }int main() {int n, root[10], rt = 0;memset(root, 0, sizeof(root));cin >> n;for(int i = 0; i < n; i++) {cin >> nd[i].left >> nd[i].right;root[nd[i].left-'0'] = root[nd[i].right-'0'] = 1; //判斷根 }for(int i = 0; i < n; i++) //求根節點 if(!root[i]) {rt = i;break;}Stack(rt);bool flag1 = false;while(!fin.empty()) {if(!flag1) flag1 = true;else cout << ' ';cout << fin.front();fin.pop();}return 0; }??????——只有一種英雄主義,就是在認清生活真相后依然熱愛生活
總結
以上是生活随笔為你收集整理的【两种解法】基础实验4-2.2 列出叶结点 (25 分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【已解决】surefire-report
- 下一篇: 【已解决】IDEA:Cannot sta