PAT.A1099 Build A Binary Search Tree

返回目录

在这里插入图片描述在这里插入图片描述

题意

二叉树有N 个结点(结点编号为0~N-1),给出每个结点的左右孩子结点的编号(不存在用-1表示)。接着给出一个N个整数的序列,需要把这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
//output
58 25 82 11 38 67 45 73 42

注意点

  1. 由于题目直接给的是结点编号的关系,因此使用二叉树的静态写法会比较方便。
  2. 对一棵二叉查找树来说,中序遍历序列是递增的,因此只需要把给定的整数序列从小到大排序,然后对给定的二叉树进行中序遍历,将排序后序列的整数按中序遍历的顺序填入二叉树,就可以形成二叉查找树。
  3. 根节点默认为0
#include<bits/stdc++.h>
using namespace std;

int n,lc,rc,data[110],pos=0;
struct Node{
	int data,lc,rc;
}node[110]; 
void ininsert(int root){
	if(root==-1)return;
	ininsert(node[root].lc);
	node[root].data=data[pos++];
	ininsert(node[root].rc);
}
void BFS(int root){
	queue<int> q;
	q.push(root);
	int num=0;
	while(!q.empty()){
		int now=q.front();
		q.pop();
		printf("%d",node[now].data);
		num++;
		if(num<n)printf(" ");
		if(node[now].lc!=-1)q.push(node[now].lc);
		if(node[now].rc!=-1)q.push(node[now].rc);
	}
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		scanf("%d%d",&lc,&rc);
		node[i].lc=lc;
		node[i].rc=rc;
	}
	for(int i=0;i<n;i++)scanf("%d",&data[i]);
	sort(data,data+n);
	ininsert(0);//中序遍历插入元素
	BFS(0)//层次遍历
    return 0;
}
发布了177 篇原创文章 · 获赞 5 · 访问量 6661

猜你喜欢

转载自blog.csdn.net/a1920993165/article/details/105516363