04-树6 Complete Binary Search Tree(浙大数据结构PTA习题)

04-树6 Complete Binary Search Tree        分数 30        作者 陈越        单位 浙江大学

Question:

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

Sample Output:

6 3 8 1 5 7 9 0 2 4

代码长度限制:16 KB        时间限制:400 ms        内存限制:64 MB

题目解析:

题目大意:给定一系列结点,如何构建一棵二叉搜索完全树(即既满足二叉搜索树的性质又满足完全二叉树的性质),并最后要求对这棵二叉搜索完全树进行层序遍历。

关键点1:通过给定结点构造出一棵完全二叉搜索树

        若结点总数量给定,那么根据完全二叉树的性质,我们可以得到其根结点左子树的结点个数和根结点右子树的结点个数;进一步,若结点按照有序(比如非递减)排列,那么根据根结点左子树的结点个数(或右子树的结点个数)和二叉搜索树的性质,我们就可以确定根结点的位置。

关键点2:实现对完全二叉搜索树的层序遍历

        借助队列实现。

参考代码:

# include<stdio.h>
# include<stdlib.h>
# include<math.h>
# define MAXNODE 1000

typedef struct TreeNode* CBST;
struct TreeNode{
	int Data;
	CBST Left;
	CBST Right;
}; 

void Swap(int* a, int* b);
void InsertSort(int Array[],int N);
CBST FindRoot(int Array[],int left,int right);
void LayerSort(CBST);

int main(){
	// 接收一个数组
	int N;
	scanf("%d",&N);
	int Array[N];
	int i;
	for(i=0;i<N;i++){
		scanf("%d",&Array[i]);
	}
	// 对一个数组进行插入排序 
	InsertSort(Array,N);
	// 构建完全二叉搜索树
	CBST tree = FindRoot(Array,0,N-1);
	// 对完全二叉搜索树进行层序遍历
	LayerSort(tree);
	
	return 0;
}

// 对一个完全二叉搜索树进行层序遍历
void LayerSort(CBST tree){
	// 创建一个队列用于输出
	CBST Array[MAXNODE];
	int Head=-1, Rear=-1;
	// 压入根结点数据 
	Array[++Rear] = tree; 
	while(Head!=Rear){
		// 出队一个结点,并分别压入其左右结点(若不为空)
		if(Head==-1)printf("%d",Array[++Head]->Data);
		else printf(" %d",Array[++Head]->Data);
		if(Array[Head]->Left!=NULL)Array[++Rear] = Array[Head]->Left;
		if(Array[Head]->Right!=NULL)Array[++Rear] = Array[Head]->Right; 
	} 
	return;
} 

// 从一个有序数组中,找到完全二叉搜索树的根结点,并且通过递归构建这棵树 
CBST FindRoot(int Array[],int left,int right){
	CBST node = (CBST)malloc(sizeof(struct TreeNode)); 
	// 如果数组中只有一个元素,则自身为根结点,直接返回 
	if(left==right){
		node->Data = Array[left];
		node->Left = node->Right = NULL;
		return node;
	} 
	//  首先判断树高多少 
	int height,total_node = right-left+1; 
	for(height=2;total_node>(int)pow(2,height)-1;height++); 
	// 计算最后一层左子树中的元素个数
	int remain_node = total_node - (int)pow(2,height-1)+1;
	if(remain_node>(int)pow(2,height-2))remain_node = (int)pow(2,height-2);
	// 计算左子树总的结点个数,则根结点的下标为left_node(一定要记得加上left,不要以为数组开头下标一直为0)
	int left_node = (int)pow(2,height-2)-1+remain_node+left; 	
	// 完善根结点信息,递归寻求其它子树根结点 
	node->Data = Array[left_node];
	if(left<left_node)node->Left = FindRoot(Array,left,left_node-1); 
	else node->Left = NULL;
	if(right>left_node)node->Right = FindRoot(Array,left_node+1,right);
	else node->Right = NULL;
	return node;
} 

// 对一个数组进行插入排序 
void InsertSort(int Array[],int N){
	int i,j,tmp;
	for(i=1;i<N;i++){
		tmp = i;
		for(j=i-1;j>=0;j--){
			if(Array[tmp]<Array[j]){
				Swap(&Array[tmp],&Array[j]);
				tmp--;
			}else{
				break;
			}
		}
	}
	return;
} 

// 交换两个地址上的值
void Swap(int* a, int* b){
	int tmp = *a;
	*a = *b;
	*b = tmp;
} 

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/676970.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Google 解释AI 概览:关于上周的一些情况

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

c++与c

命名空间的设置&#xff1a; 避免冲突 命名空间&#xff1a; 如果将变量全部定义在全局可能不安全&#xff0c;都可以进行修改。 如果将变量定义在局部&#xff0c;当出了大括号就不能使用。 所以说在定义一个命名空间的时候 定义函数&#xff0c;变量&#xff0c;命名空间…

菜刀冰蝎哥斯拉流量通讯特征绕过检测反制感知

1.加密流程 工具名称requestsresponseAntSwordbase64等方式明文冰蝎2.0开启Openssl扩展-动态密钥aes加密aes加密base64未开启Openssl扩展-异或异或base64冰蝎3.0开启Openssl扩展-静态密钥aes加密aes加密base64未开启Openssl扩展-异或异或base64哥斯拉php的为base64异或base64异…

【智能算法】花斑翠鸟优化算法(PKO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;A Bouaouda受到自然界中花斑翠鸟社会行为启发&#xff0c;提出了花斑翠鸟优化算法&#xff08;Pied Kingfisher Optimizer, PKO&#xff09;。 2.算法原理 2.1算法思想…

1103. 分糖果 II Rust等差求和+一元二次方程求根(击败100% Rust用户)

题目内容 排排坐&#xff0c;分糖果。 我们买了一些糖果 candies&#xff0c;打算把它们分给排好队的 n num_people 个小朋友。 给第一个小朋友 1 颗糖果&#xff0c;第二个小朋友 2 颗&#xff0c;依此类推&#xff0c;直到给最后一个小朋友 n 颗糖果。 然后&#xff0c;…

Redis缓存(笔记二:Redis常用五大数据类型)

目录 1、Redis中String字符串 1.1 常用命令解释&#xff1a; 1.2 原子性 1.3 具有原子性的常用命令 1.4 String数据结构 1、Redis中String字符串 概念 String 是 Redis 最基本的类型&#xff0c;可以理解成与 Memcached 一模一样的类型&#xff0c;一个 key对应一个 value…

STL容器--list

1. list的介绍及使用 1.1 list的介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指其前…

2.3 OpenCV随手简记(四)

阈值处理是很多高级算法底层处理的预方法之一。 自己求图像平均阈值&#xff1a; # -*- codingGBK -*- import cv2 as cv import numpy as np #求出图像均值作为阈值来二值化 def custom_image(image): gray cv.cvtColor(image, cv.COLOR_BGR2GRAY) cv.imshow("原来&qu…

微服务网关Gateway(下)

CSDN 的小伙伴们&#xff0c;大家好呀&#xff0c;我是苍何。 这篇文章我们继续来说下我们项目中用到的微服务网关 Gateway 的技术点。主要涵盖过滤器&#xff0c;限流处理以及黑白名单配置。 过滤器 网关中的过滤器&#xff0c;有点类似 SpringMVC 里面的拦截器 Intercepto…

面试官:什么是Redis持久化—>AOF持久化

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

Python | Leetcode Python题解之第130题被围绕的区域

题目&#xff1a; 题解&#xff1a; class Solution:def solve(self, board: List[List[str]]) -> None:if not board:returnn, m len(board), len(board[0])que collections.deque()for i in range(n):if board[i][0] "O":que.append((i, 0))board[i][0] &q…

C语言 | Leetcode C语言题解之第129题求根节点到叶节点数字之和

题目&#xff1a; 题解&#xff1a; int sumNumbers(struct TreeNode* root) {if (root NULL) {return 0;}int sum 0;struct TreeNode* nodeQueue[2000];int numQueue[2000];int leftQueue 0, rightQueue 0;nodeQueue[rightQueue] root;numQueue[rightQueue] root->v…

MPEG-TS 封装格式详解

MPEG-TS 封装格式详解 MPEG-TS 封装格式详解简介基本概念TS 文件格式PSI&#xff08;Program Specific Information&#xff09;节目关联表&#xff08;PAT&#xff0c;Program Association Table&#xff09;节目映射表&#xff08;PMT&#xff0c;Program Map Table&#xff…

探索k8s集群的配置资源(secret和configmap)

目录 ConfigMap ConfigMap&#xff08;主要是将配置目录或者文件挂载到k8s里面使用&#xff09; 与Secret类似&#xff0c;区别在于ConfigMap保存的是不需要加密配置的信息。&#xff08;例如&#xff1a;配置文件&#xff09; ConfigMap 功能在 Kubernetes1.2 版本中引入&…

算法 java 排序和查找

排序和查找 冒泡排序&#xff08;稳定&#xff09;选择排序&#xff08;不稳定&#xff09;插入排序&#xff08;稳定&#xff09;希尔排序&#xff08;不稳定&#xff09;归并排序&#xff08;稳定&#xff09;快速排序&#xff08;不稳定&#xff09;堆排序计数排序桶排序基数…

Scikit-Learn随机森林分类

Scikit-Learn随机森林分类 1、随机森林分类1.1、随机森林分类概述1.2、随机森林分类的优缺点2、Scikit-Learn随机森林分类2.1、Scikit-Learn随机森林分类API2.2、Scikit-Learn随机森林分类初体验(葡萄酒分类)2.3、Scikit-Learn随机森林分类实践(鸢尾花分类)2.4、参数调优与…

undefined symbol: _ZN3c104impl8GPUTrace13gpu mmcv

这里写自定义目录标题 ImportError: //python3.8/site-packages/mmcv/_ext.cpython-38-x86_64-linux-gnu.so: undefined symbol: _ZN3c104impl8GPUTrace13gpuTraceStateEERROR conda.cli.main_run:execute(49): 这样的问题往往都是版本不匹配导致的 pytorch的版本&#xff0c;m…

为Android组件化项目搭建Maven私服

概览 文章目录 概览前言搭建 maven 私服服务器环境jdk安装配置nexus安装配置管理创建存储点、仓库 项目中使用 maven 私服上传 module 到仓库自动发布 module手动上传单个aar包 引用仓库中的 modulebuild.gradle引入远程module FAQ开发阶段有些module用远程依赖&#xff0c;有些…

构建大型语言模型(LLM)产品的实战指南

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

#13前端后花园周刊-10个现代 Node.js 运行时新特性、Nextjs15、Astro4.9、CSS压缩

⚡️行业动态 JavaScript 的创建者 Brendan Eich 在 Twitter/X 上出现&#xff0c;反驳了 JS 是“最邋遢的”的说法&#xff0c;称其只有 50% 。 &#x1f4c6;发布 Next.js 15 RC 流行的 React 元框架已经准备好迎接一个主要的新版本&#xff0c;它有一个 RC&#xff0c;让…