数据结构(三)树 —— 编程作业 07 :Complete Binary Search Tree

数据结构系列内容的学习目录 → \rightarrow 浙大版数据结构学习系列内容汇总

  题目描述: 一棵二叉搜索树(BST)被递归定义为具有以下特性的一棵二叉树:
         ∙ \bullet 一个结点的左子树只包含键值小于该结点键值的结点;
         ∙ \bullet 一个结点的右子树只包含键值大于或等于该结点键值的结点;
         ∙ \bullet 左子树和右子树也必须是二叉搜索树。
        完全二叉树(CBT)是一棵完全填充的树,除了底层,它是从左到右填充的。
        现在给定一个不同的非负整数序列,如果要求树必须也是CBT,则可以构造一个唯一的BST。任务是输出这个BST的层序遍历序列。

  输入格式: 每个输入文件包含一个测试用例。
        对于每种情况,第一行包含一个正整数N( ⩽ \leqslant 1000)。
        然后N个不同的非负整数在下一行给出。
        一行中的所有数字用空格分隔,且不大于2000。

  输出格式: 对于每个测试用例,在一行中打印相应的完全二叉搜索树的层序遍历序列。
        一行中的所有数字必须用空格分隔,行尾不能有多余的空格。

  输入样例:

10
1 2 3 4 5 6 7 8 9 0

  输出样例:

6 3 8 1 5 7 9 0 2 4

  解题思路: 完全二叉树在层序遍历输出时,下标为 i 的节点的左孩子和右孩子的下标分别为 2i 和 2i+1。
        二叉搜索树的中序输出为一个升序的序列,当对输入的数据进行升序排列后获得了完全二叉排序树的中序遍历结果。

在这里插入图片描述

        已知中序遍历结果,再知道排列后的结点在层序遍历输出时的序号,就可以得到层序遍历输出结果。

  代码实现:

#include<iostream>
using namespace std;
#include<algorithm>
#define MaxNum 1001
int LevelOrder[MaxNum];
int j = 0;

void InOrder_BST(int root, int N, int InOrder[]) 
{
	if (root <= N) 
	{
		//完全二叉树在层序输出时,下标为i的结点的左孩子和右孩子的下标分别为2i,2i+1
		InOrder_BST(root * 2, N, InOrder);
		LevelOrder[root] = InOrder[j++];
		InOrder_BST(root * 2 + 1, N, InOrder);
	}
}

int main() 
{
	int N, InOrder[MaxNum];
	cin >> N;
	for (int i = 0; i < N; i++) 
	{
		cin >> InOrder[i];
	}
	sort(InOrder, InOrder + N);  //二叉搜索树的中序输出为一个升序的序列,当对输入的数据进行升序排列后获得了完全二叉排序树的中序遍历结果
	InOrder_BST(1, N, InOrder);
	cout << LevelOrder[1];
	for (int i = 2; i <= N; i++) 
	{
		cout << " " << LevelOrder[i];
	}
	system("pause");
	return 0;
}

  测试: 输入样例的测试效果如下图所示。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值