1099 Build A Binary Search Tree (30)

//指定了树结构的BST
Sample Input:
//给定了树结构,输入顺序为结点编号(0~N-1)(Node[]下标),root为0结点,-1代表无孩子
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
Sample Output:
//层序遍历
58 25 82 11 38 67 45 73 42
//将给定的二叉树结点中序遍历,他们应该是有序的,所以将这些节点的下标(Node[]里的下标)存放到a[]中用来被赋值,
//将给定的数排序成number[],对应赋值即:index=0; for(){ Node[a[index++]] = number[index++];
//最后遍历
//code:
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN = 2020;
struct node{
	int data;
	int lChild;  //静态(数组)存储
	int rChild;
} Node[MAXN];
int N, number[MAXN], a[MAXN], index = 0;
void inOrder(int root) {
	if(root == -1) return;
	inOrder(Node[root].lChild);
	a[index++] = root;  //a[]存放的是下标
	inOrder(Node[root].rChild);
}
void solve() {
	index = 0;
	for(int i=0; i<N; i++)
		Node[a[i]].data = number[index++];
}
void levelOrder(int root) {
	queue<int> q;
	q.push(root);
	while(!q.empty()) {
		int now = q.front();
		q.pop();
		printf("%d",Node[now].data);
		if(Node[now].lChild != -1) q.push(Node[now].lChild);
		if(Node[now].rChild != -1) q.push(Node[now].rChild);
		if(!q.empty()) printf(" ");
	}
}
int main() {
	scanf("%d",&N);
	for(int i=0; i<N; i++) {
		int left_index, right_index;
		scanf("%d%d",&left_index,&right_index);
		if(left_index != -1) Node[i].lChild = left_index;
		else Node[i].lChild = -1;  不用NULL,既然是数组
		if(right_index != -1) Node[i].rChild = right_index;
		else Node[i].rChild = -1;
	}
	for(int i=0; i<N; i++)
		scanf("%d",&number[i]);
	sort(number, number + N);
	inOrder(0);
	solve();  //对应赋值
	levelOrder(0);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值