Complete Binary Search Tree 完全二叉搜索树
题目:https://pintia.cn/problem-sets/16/problems/669
完全二叉搜索树=完全二叉树+二叉搜索树。从树的形状上来看,一定是从上至下、从左至右摆满的。而树的插入跟输入顺序一点关系也没有,题目中说明了:给定一组输入数据,有唯一的完全二叉搜索树与之对应。
测试样例为:10
1 2 3 4 5 6 7 8 9 0
先来手动建立一下这棵树,有了以下的发现:
- 给定结点数量后,根结点的左右子树各自结点数是可以计算的。
- 根结点可以被唯一确定,即它的大小排在左子树后面。
- 左右子树均为完全二叉搜素树。
有了上面几个条件,我们只需要:
- 将输入数据排序,存放在数组中。
- 递归地确定每一个结点。
代码:
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 1001 typedef struct Node* List; struct Node { int data; List next; }; int sortdata[MAXSIZE]; int treedata[MAXSIZE]; void sort(int n){ if (n == 0) return; List head = (List)malloc(sizeof(struct Node)); head->data = -1; head->next = NULL; int i; List p, q, neww; int num; for (i = 0;i < n;i++) { q = head; p = q->next; scanf("%d", &num); while (num > q->data) { if (q->next == NULL) { p = NULL; break; } else { if (num < q->next->data) { p = q->next; break; } q = q->next; } } neww = (List)malloc(sizeof(struct Node)); neww->data = num; if (p) neww->next = p; else neww->next = NULL; q->next = neww; } p = head->next; i = 1; while (p) { sortdata[i] = p->data; p = p->next; i++; } return; } int calcu(int num) { int i = 0; int mult = 1; int dep=0; int count = 0; if (num == 1) return 0; while (mult <= num) { mult *= 2; dep = mult/2; count += dep; i++; } count -= dep; int add = (num-count) > (dep/2) ? (dep / 2) : (num - count); return (num-1-num+count)/2+add; } void Built(int root, int start, int end) { if (start == end) { treedata[root] = sortdata[start]; return; } if (start > end) return; int mid = start + calcu(end - start + 1); treedata[root] =sortdata[mid]; Built(root * 2, start, mid - 1); Built(root * 2 + 1, mid + 1, end); return; } int main() { int N; scanf("%d", &N); sort(N); int i; Built(1, 1, N); for (i = 1;i <= N;i++) { printf("%d", treedata[i]); if (i != N) printf(" "); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律