【PAT甲级 - C++题解】1064 Complete Binary Search Tree

简介: 【PAT甲级 - C++题解】1064 Complete Binary Search Tree

1064 Complete Binary Search Tree


A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:


The left subtree of a node contains only nodes with keys less than the node’s key.

The right subtree of a node contains only nodes with keys greater than or equal to the node’s key.

Both the left and right subtrees must also be binary search trees.

A Complete Binary Tree (CBT) is a tree that is completely filled, with the possible exception of the bottom level, which is filled from left to right.


Now given a sequence of distinct non-negative integer keys, a unique BST can be constructed if it is required that the tree must also be a CBT. You are supposed to output the level order traversal sequence of this BST.

Input Specification:


Each input file contains one test case. For each case, the first line contains a positive integer N (≤1000). Then N distinct non-negative integer keys are given in the next line. All the numbers in a line are separated by a space and are no greater than 2000.

Output Specification:


For each test case, print in one line the level order traversal sequence of the corresponding complete binary search tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.

Sample Input:

10
1 2 3 4 5 6 7 8 9 0
• 1
• 2

Sample Output:

6 3 8 1 5 7 9 0 2 4


题意

二叉搜索树 (BST) 递归定义为具有以下属性的二叉树:


若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值

若它的右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值

它的左、右子树也分别为二叉搜索树

完全二叉树 (CBT) 定义为除最深层外的其他层的结点数都达到最大个数,最深层的所有结点都连续集中在最左边的二叉树。


现在,给定 N NN 个不同非负整数,表示 N NN 个结点的权值,用这 N NN 个结点可以构成唯一的完全二叉搜索树。


请你输出该完全二叉搜索树的层序遍历。

思路

我们可以利用完全二叉树的性质,用一个一维数组来存储,如果当前结点第下标为 u (假设下标从 1 开始),则满足以下条件:

该结点的左孩子下标为 u * 2

该结点的右孩子下标为 u * 2 + 1

由于题目给定的是结点的值,所以我们可以通过对结点的值进行排序,从而得到中序遍历的数组,因为二叉搜索树的中序遍历结果一定是有序的。

然后通过模拟中序遍历并利用上述完全二叉树的性质,将每一个值放到对应的位置上。

因为存储完全二叉树结点值的数组和其层序遍历的结果一样,直接从前往后输出该数组即可。


92303ca3056543e7b4df1bb282aa8b50.png


代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int n;
int w[N], tr[N];
//中序遍历
void dfs(int u, int& k)
{
    if (u * 2 <= n)  dfs(u * 2, k);
    tr[u] = w[k++];
    if (u * 2 + 1 <= n) dfs(u * 2 + 1, k);
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)    cin >> w[i];
    sort(w, w + n);    //得到中序遍历数组
    int k = 0;
    dfs(1, k);   //中序遍历的同时生成完全二叉树
    //输出结果
    cout << tr[1];
    for (int i = 2; i <= n; i++)   cout << " " << tr[i];
    cout << endl;
    return 0;
}


目录
相关文章
|
6月前
|
JSON 数据格式 C++
C++ JSON库 nlohmann::basic_json::binary 的用法
C++ JSON库 nlohmann::basic_json::binary 的用法
98 0
|
C++
【PAT甲级 - C++题解】1040 Longest Symmetric String
【PAT甲级 - C++题解】1040 Longest Symmetric String
66 0
|
算法 C++
【PAT甲级 - C++题解】1044 Shopping in Mars
【PAT甲级 - C++题解】1044 Shopping in Mars
82 0
|
C++
【PAT甲级 - C++题解】1117 Eddington Number
【PAT甲级 - C++题解】1117 Eddington Number
77 0
|
10天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
37 4
|
11天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
35 4
|
1月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
1月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
23 4
|
1月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)