PAT-ADVANCED1099——Build A Binary Search Tree
阿新 • • 發佈:2018-11-06
我的PAT-ADVANCED程式碼倉:https://github.com/617076674/PAT-ADVANCED
原題連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805367987355648
題目描述:
題目翻譯:
1099 建立一棵二分搜尋樹
一棵二分搜尋樹是一棵二叉樹,遞迴地定義如下:
左子樹的節點都小於當前節點的值。
右子樹的節點都大於或等於當前節點的值。
左右子樹都是一棵二分搜尋樹。
給出一棵樹的結構以及一串不同的數值,只有一種填法能使得這棵樹是一棵二分搜尋樹。你需要輸出這棵樹的層序遍歷。樣例由下面這張圖說明。
輸入格式:
每個輸入檔案包含一個測試用例。在每個測試用例中,第一行有一個正整數N(<= 100),代表樹中的節點總數。題目保證節點編號為0 ~ N - 1,根節點編號為0。接下來的N行,每行以形式——“left_index right_index”,給出一個節點的左右孩子資訊。如果一個節點的左孩子或右孩子缺失,用-1填充。最後一行給出N個不同數的資訊。
輸出格式:
對每個測試用例,你需要在一行中輸出其層序遍歷結果。一行中的所有數字都由一個空格隔開,行末不得有多餘空格。
輸入樣例:
9
1 6
2 3
-1 -1
-1 4
5 -1
-1 -1
7 -1
-1 8
-1 -1
73 45 11 58 82 25 67 38 42
輸出樣例:
58 25 82 11 38 67 45 73 42
知識點:二分搜尋樹的中序遍歷、層序遍歷
思路:中序遍歷所給的樹結構,依次填充數值
本題和PAT-ADVANCED1064——Complete Binary Search Tree很像,都是給出了二分搜尋樹的樹結構,需要我們往其中填入值。
以往我們中序遍歷都是列印其節點元素,而這次只不過是換成了往節點中填入值。
時間複雜度是O(NlogN)。空間複雜度是O(N)。
C++程式碼:
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
struct node {
int data;
int lchild;
int rchild;
};
int N;
node Node[100];
vector<int> inOrder;
int index = 0;
vector<int> levelOrder;
void inOrderTraversal(int root);
void levelOrderTraversal(int root);
void print();
int main(){
cin >> N;
int left, right;
for(int i = 0; i < N; i++){
cin >> left >> right;
Node[i].lchild = left;
Node[i].rchild = right;
}
int num;
for(int i = 0; i < N; i++){
cin >> num;
inOrder.push_back(num);
}
sort(inOrder.begin(), inOrder.end());
inOrderTraversal(0);
levelOrderTraversal(0);
print();
return 0;
}
void inOrderTraversal(int root) {
if(root == -1){
return;
}
inOrderTraversal(Node[root].lchild);
Node[root].data = inOrder[index++];
inOrderTraversal(Node[root].rchild);
}
void levelOrderTraversal(int root){
queue<int> q;
q.push(root);
while(!q.empty()){
int now = q.front();
levelOrder.push_back(Node[now].data);
q.pop();
if(Node[now].lchild != -1){
q.push(Node[now].lchild);
}
if(Node[now].rchild != -1){
q.push(Node[now].rchild);
}
}
}
void print() {
for(int i = 0; i < levelOrder.size(); i++){
cout << levelOrder[i];
if(i != levelOrder.size() - 1){
cout << " ";
}
}
}
C++解題報告: