【PAT】1115. Counting Nodes in a BST (30)【树的层次遍历】

2024-04-12 06:08

本文主要是介绍【PAT】1115. Counting Nodes in a BST (30)【树的层次遍历】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

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 or
    equal to the node’s key.
  • The right subtree of a node contains only nodes with keys greater
    than the node’s key.
  • Both the left and right subtrees must also be binary search trees.

Insert a sequence of numbers into an initially empty binary search tree. Then you are supposed to count the total number of nodes in the lowest 2 levels of the resulting tree.

翻译:一棵二叉搜索树(BST) 按照以下规则递归定义一棵二叉树:

  • 左子树的节点的键值小于等于该节点的键值。
  • 右子树的节点的键值大于该节点的键值。
  • 左右子树都必须也是二叉搜索树。

将一个数列插入到一棵空初始二叉搜索树中。接着你需要计算出最后得到的树的最后两层节点的个数。

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤1000) which is the size of the input sequence. Then given in the next line are the N integers in [−1000,1000] which are supposed to be inserted into an initially empty binary search tree.

翻译:每个输入文件包含一组测试数据。对于每组输入数据,第一行包括一个正整数N(≤1000),表示输入队列的长度。接下来一行包括 [−1000,1000] 的N个需要被插入空二叉搜索树的整数。

Output Specification:

For each case, print in one line the numbers of nodes in the lowest 2 levels of the resulting tree in the format:

n1 + n2 = n
where n1 is the number of nodes in the lowest level, n2 is that of the level above, and n is the sum.

翻译:对于每组输入数据,按照以下格式输出一行最后得到的树的最后两层节点之和:
n1 + n2 = n
n1表示最后一层的节点数,n2表示它的上一层的节点数,n表示它们之和。


Sample Input:

9
25 30 42 16 20 20 35 -5 28


Sample Output:

2 + 4 = 6


解题思路

将节点顺序插入二叉搜索树,然后对树进行层次遍历,用bottom和abovebottom来记录最后一层和上一层的值,详见代码。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#define INF 99999999
#define bug puts("Hello\n")
using namespace std;
int N,BST[1010][3];//0存放节点值,1存放左节点编号,2存放右节点编号 
void join(int a,int root){if(BST[a][0]<=BST[root][0]){if(BST[root][1]!=0){join(a,BST[root][1]);}else BST[root][1]=a;}else{if(BST[root][2]!=0){join(a,BST[root][2]);}else BST[root][2]=a;	}
}typedef pair<int,int>P;
queue<P>q;
int level[1010],bottomlevel=0,bottom=0,abovebottom=0;
void bfs(){q.push(P(0,1));while(!q.empty()){P tmp=q.front();q.pop();level[tmp.first]=tmp.second;if(bottomlevel<tmp.second){bottomlevel=tmp.second;abovebottom=bottom;bottom=1;}else if(bottomlevel==tmp.second){bottom++;	}if(BST[tmp.first][1])q.push(P(BST[tmp.first][1],tmp.second+1));if(BST[tmp.first][2])q.push(P(BST[tmp.first][2],tmp.second+1));}
}int main(){scanf("%d",&N);for(int i=0;i<N;i++){scanf("%d",&BST[i][0]);if(i!=0)join(i,0);} bfs();int ans=bottom+abovebottom;printf("%d + %d = %d\n",bottom,abovebottom,ans);return 0;
}

这篇关于【PAT】1115. Counting Nodes in a BST (30)【树的层次遍历】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/896315

相关文章

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

c++习题30-求10000以内N的阶乘

目录 一,题目  二,思路 三,代码    一,题目  描述 求10000以内n的阶乘。 输入描述 只有一行输入,整数n(0≤n≤10000)。 输出描述 一行,即n!的值。 用例输入 1  4 用例输出 1  24   二,思路 n    n!           0    1 1    1*1=1 2    1*2=2 3    2*3=6 4

MATLAB层次聚类分析法

转自:http://blog.163.com/lxg_1123@126/blog/static/74841406201022774051963/ 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征

嵌入式面试经典30问:二

1. 嵌入式系统中,如何选择合适的微控制器或微处理器? 在嵌入式系统中选择合适的微控制器(MCU)或微处理器(MPU)时,需要考虑多个因素以确保所选组件能够满足项目的具体需求。以下是一些关键步骤和考虑因素: 1.1 确定项目需求 性能要求:根据项目的复杂度、处理速度和数据吞吐量等要求,确定所需的处理器性能。功耗:评估系统的功耗需求,选择低功耗的MCU或MPU以延长电池寿命或减少能源消耗。成本

【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)「首先来看看目前已有的资料,还会不断更新哦~一次购买,后续不会再被收费哦,保证是全网最全资源,随着后续内容更新,价格会上涨,越早购买,价格越低,让大家再也不需要到处买断片资料啦~💰💸👋」�