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

Posted 大彤小忆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构树 —— 编程作业 07 :Complete Binary Search Tree相关的知识,希望对你有一定的参考价值。

  题目描述: 一棵二叉搜索树(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;
}

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

在这里插入图片描述

以上是关于数据结构树 —— 编程作业 07 :Complete Binary Search Tree的主要内容,如果未能解决你的问题,请参考以下文章

数据结构树 —— 编程作业 05 :是否同一棵二叉搜索树

数据结构树 —— 编程作业 01 :树的同构

数据结构树 —— 编程作业 11 :Huffman Codes

数据结构树 —— 编程作业 09 :堆中的路径

数据结构树 —— 编程作业 10 :File Transfer

数据结构树 —— 编程作业 02 :List Leaves