【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;
}


目录
相关文章
|
算法 C++ iOS开发
软件开发入门教程网 Search之C++ 接口(抽象类)
软件开发入门教程网 Search之C++ 接口(抽象类)
|
数据安全/隐私保护 C++ iOS开发
软件开发入门教程网 Search之C++ 继承
软件开发入门教程网 Search之C++ 继承
|
并行计算 程序员 C++
软件开发入门教程网 Search之C++ 简介
软件开发入门教程网 Search之C++ 简介
|
6月前
|
缓存 算法 C语言
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
86 0
|
编译器 C语言 C++
软件开发入门教程网 Search之C++ 环境设置
软件开发入门教程网 Search之C++ 环境设置
|
6月前
|
算法 前端开发 大数据
【C/C++ 基础知识 】C++中易混淆的函数和关键字:std::find vs std::search,std::remove vs std::erase,remove vs delete
【C/C++ 基础知识 】C++中易混淆的函数和关键字:std::find vs std::search,std::remove vs std::erase,remove vs delete
144 0
|
6月前
|
JSON 数据格式 C++
C++ JSON库 nlohmann::basic_json::binary 的用法
C++ JSON库 nlohmann::basic_json::binary 的用法
94 0
|
存储 程序员 C语言
软件开发入门教程网 Search之C++ 动态内存
软件开发入门教程网 Search之C++ 动态内存
|
C++
【PAT甲级 - C++题解】1040 Longest Symmetric String
【PAT甲级 - C++题解】1040 Longest Symmetric String
65 0
|
21天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
21 4