From fb5845d9f0494e70e5211d5b5951bef92aac56d6 Mon Sep 17 00:00:00 2001 From: liuchuo <95323362@qq.com> Date: Wed, 4 Mar 2020 18:32:03 +0800 Subject: [PATCH] Update 1064. Complete Binary Search Tree (30).cpp --- ...1064. Complete Binary Search Tree (30).cpp | 29 +++++++------------ 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/AdvancedLevel_C++/1064. Complete Binary Search Tree (30).cpp b/AdvancedLevel_C++/1064. Complete Binary Search Tree (30).cpp index feeccd0..1a53c94 100644 --- a/AdvancedLevel_C++/1064. Complete Binary Search Tree (30).cpp +++ b/AdvancedLevel_C++/1064. Complete Binary Search Tree (30).cpp @@ -1,30 +1,21 @@ #include -#include #include -#include using namespace std; -vector in, level; -void levelorder(int start, int end, int index) { - if(start > end) return ; - int n = end - start + 1; - int l = log(n + 1) / log(2); // 除了最后一层的层数 - int leave = n - (pow(2, l) - 1);// 最后一层的叶子节点数 - int root = start + (pow(2, l - 1) - 1) + min((int)pow(2, l - 1), leave); // pow(2, l - 1) - 1是除了root结点所在层和最后一层外,左子树的结点个数,pow(2, l - 1) 是l+1层最多拥有的属于根结点左子树的结点个数,min(pow(2, l - 1), leave)是最后一个结点真正拥有的属于根结点左子树上的结点个数 - level[index] = in[root]; - levelorder(start, root - 1, 2 * index + 1); - levelorder(root + 1, end, 2 * index + 2); +int in[1010], level[1010], n, t = 0; +void inOrder(int root) { + if (root >= n) return ; + inOrder(root * 2 + 1); + level[root] = in[t++]; + inOrder(root * 2 + 2); } int main() { - int n; scanf("%d", &n); - in.resize(n); - level.resize(n); - for(int i = 0 ; i < n; i++) + for (int i = 0; i < n; i++) scanf("%d", &in[i]); - sort(in.begin(), in.end()); - levelorder(0, n - 1, 0); + sort(in, in + n); + inOrder(0); printf("%d", level[0]); - for(int i = 1; i < n; i++) + for (int i = 1; i < n; i++) printf(" %d", level[i]); return 0; } \ No newline at end of file