PAT-ADVANCED1099——Build A Binary Search Tree

版权声明:我的GitHub:https://github.com/617076674。真诚求星! https://blog.csdn.net/qq_41231926/article/details/83649896

我的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++解题报告:

猜你喜欢

转载自blog.csdn.net/qq_41231926/article/details/83649896