18行代码AC——PTA 二叉树的遍历 (10分)——解题报告
生活随笔
收集整理的這篇文章主要介紹了
18行代码AC——PTA 二叉树的遍历 (10分)——解题报告
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
勵志用盡量少的代碼做高效的表達。
根據輸入構造二叉樹,輸出該二叉樹的先序序列。二叉樹共有N個節點,節點編號是1到N。約定1號節點是根節點。
輸入格式:
第一行輸入整數N。 接下來有N行,依次給出1到N節點的左孩子和右孩子。對于這N行中的每一行,有兩個整數。第i(i=1, 2, …, N)行中,第一個整數指出左孩子的編號,第二個整數指出右孩子的編號。如果整數值為0,表示沒有左孩子或右孩子。
輸出格式:
輸出一行,內容是二叉樹的先序序列。節點編號之間用空格隔開,行末有1個空格。
輸入樣例:
6
2 5
3 4
0 0
0 0
0 6
0 0
輸出樣例:
1 2 3 4 5 6
思路分析:
本題的核心思路是:結構體數組模擬指針建樹。
最開始嘗試用指針構建二叉樹解題,但做得不舒服,解不出來。仔細思考了一下,有兩點原因。
(一)、指針建樹的優點在于:在不知道節點數目的情況下, 我們仍然可以通過“動態擴充”建樹, 但本題已經給了結點數,及每個左右子樹,這種情況下如果再用指針建樹,就相當于給我們一個條件我們沒用。
(二)、題中說每行對應每個節點的操作,也就是說:并不是亂序給我們的,我們可以通過循環遍歷的方式很輕松的給結構體數組賦值。
考慮到這兩點,我將其改進為結構體數組建樹,不過結構體中的左右“子樹”為int型。同樣可以采用遞歸構造。很快就AC了。
代碼:(不算注釋為18行)
#include<iostream> using namespace std; struct Node {int l, r; }; //先序遍歷 void Fir(Node nodes[], int root) {if(root == 0) return; //遞歸結束的標志cout << root << " "; //先序遍歷的三行核心代碼,Fir(nodes, nodes[root].l); Fir(nodes, nodes[root].r); } int main() {int n; cin >> n;Node nodes[n+1];for(int i = 1; i <= n; i++) cin >> nodes[i].l >> nodes[i].r; //輸入某節點的左右子樹值Fir(nodes, 1); //約定1號節點是根節點 return 0; }收獲:
1、結構體數組模擬指針建樹。
擇苦而安,擇做而樂,虛擬現實終究比不上真實精彩之萬一。
總結
以上是生活随笔為你收集整理的18行代码AC——PTA 二叉树的遍历 (10分)——解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 31行代码AC——PTA 求二叉树的叶子
- 下一篇: 22行代码AC——例题7-1除法(Div