L3-010 是否完全二叉搜索树 (30 分)

将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。

输入格式:

输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。

输出格式:

将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出YES,如果该树是完全二叉树;否则输出NO

输入样例1:

9
38 45 42 24 58 30 67 12 51

输出样例1:

38 45 24 58 42 30 12 67 51
YES

输入样例2:

8
38 24 12 45 58 67 42 51

输出样例2:

38 45 24 58 42 12 67 51
NO

解题思路

用数组存树,下标为x左子树下标为2*x,右子树下标为2*x+1。按下标顺序(不包括空的)即为层序遍历。如果数组前n位都存了一个节点,那么就是完全二叉搜索树。

代码如下

#include <iostream>
#define maxn 1048580
using namespace std;
int tree[maxn];
int main()
{
	int n;
	cin >> n;
	int maxx = 0;
	for(int i = 0; i < n; i ++){
		int x;
		cin >> x;
		int now = 1;
		while(tree[now]){
			if(x > tree[now])
				now = now * 2;
			else 
				now = now * 2 + 1;
		}
		if(now > maxx)
			maxx = now;
		tree[now] = x;
	}
	bool flg = true;
	for(int i = 1; i <= maxx; i ++){
		if(tree[i]){
			if(i != 1)
				cout << " ";
			cout << tree[i];
		}
		else
			flg = false;
	}
	cout << endl;
	if(flg)
		cout << "YES" << endl;
	else
		cout << "NO" << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/whisperlzw/article/details/88603272