PAT甲级1115 Counting Nodes in a BST (30分):[C++题解] 递归建二叉搜索树、dfs求一层结点数量
文章目录
- 题目分析
- 题目链接
题目分析
分析
首先本题给定的二叉搜索树的定义和其他地方的不同。本题小于等于的是左子树,右子树是大于根结点的。
然后说一下做题的思路。
给定一串数据,让构造二叉搜索树。 先想一想怎么存二叉树,想用左儿子数组l[ ] 和右儿子数组 r[ ] 来存。这样就得从根结点一直递归下去,其实给定的第一个数就是根结点。
建树的过程其实还是一个递归。比较待插入的值和当前这个结点的大小关系,如果是小于等于,就插入到左边;如果是大于当前结点,就插入到右边。
对于求倒数两层的结点数量,统计每一层的结点数用的是dfs,没用bfs的原因是还多写队列,代码更长一点。相比之下dfs代码短很多,每层的结点数量存在cnt [ ] 数组中。
下面是根据一串数据递归建造二叉搜索树的代码
/*
insert用来构造二叉搜索树
u:结点下标
w:权重
*/
void insert(int& u ,int w){//如果遍历到某个点发现是空的,就生成新的结点,插入进来// u == 0表示空结点if(u == 0){u = ++ idx;v[u] = w;}//否则的话当前结点有值,比对一下插入左边还是右边else if( w <= v[u]) insert(l[u], w);else insert(r[u], w);
}
需要记录一下,每来一个数据都是从根结点比下来的,小于等于根结点就往左,大于就往右。这样的代价是用了一个根结点,两个儿子数组。
AC代码
#include<bits/stdc++.h>
using namespace std;const int N = 1010;int n;
int l[N] ,r[N];
int v[N]; //权值
int idx; //当前用到的编号,idx从1开始int cnt[N];//每层节点的数量
int max_depth; //最大层数/*
insert用来构造二叉搜索树
u:结点下标
w:权重
*/
void insert(int& u ,int w){//如果遍历到某个点发现是空的,就生成新的结点,插入进来// u == 0表示空结点if(u == 0){u = ++ idx;v[u] = w;}//否则的话当前结点有值,比对一下插入左边还是右边else if( w <= v[u]) insert(l[u], w);else insert(r[u], w);
}//dfs深度优先搜索,求每一层的结点数
void dfs( int u, int depth){if( u == 0) return;cnt[depth] ++; //depth这一层的结点数量++max_depth = max(max_depth, depth);dfs(l[u],depth+1);dfs(r[u],depth+1);
}
int main(){cin >> n;int root = 0;for ( int i =1; i<= n; i ++){int w;cin>> w;insert(root, w);//根结点下标是1}dfs(root, 0); //从根结点开始,根结点是第0层int n1 = cnt[max_depth] ,n2 = cnt[max_depth -1];printf("%d + %d = %d",n1,n2,n1+n2);}
题目链接
PAT甲级1115 Counting Nodes in a BST (30分)
PAT甲级1115 Counting Nodes in a BST (30分):[C++题解] 递归建二叉搜索树、dfs求一层结点数量相关推荐
- 1115 Counting Nodes in a BST (30 分)【难度: 一般 / 知识点: 构建二叉搜索树】
https://pintia.cn/problem-sets/994805342720868352/problems/994805355987451904 很经典的构建搜索二叉树. #include& ...
- 1115. Counting Nodes in a BST (30) 数据结构
给出一颗BST树 求这个数最后两层的节点数量 用c1+c2 = n 的形式给出 建树深度搜索即可 #include<iostream> #include<cstdio> #in ...
- 1115 Counting Nodes in a BST(甲级)
1115 Counting Nodes in a BST (30分) A Binary Search Tree (BST) is recursively defined as a binary tre ...
- PAT甲级1135 Is It A Red-Black Tree (30分):[C++题解]判断红黑树
文章目录 题目分析 题目链接 题目分析 分析 给定前序遍历,同时红黑树一定是二叉搜索树,所以它的中序遍历就是从小到大排序.因此这道题是给定了前序遍历和中序遍历让建立二叉搜索树(BST). 数据结构中有 ...
- PAT甲级1151 LCA in a Binary Tree (30 分):[C++题解]LCA、最低公共祖先、哈希表映射
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 和下面这道题几乎是同一题:PAT甲级1143 Lowest Common Ancestor (30 分):[C++题解]LCA.最低 ...
- PAT甲级1087 All Roads Lead to Rome (30分):[C++题解]dijkstra求单源最短路综合、最短路条数、保存路径
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 首先这是一道dijkstra算法求最短路的题目,不过此题较为复杂.首先需要将字符串城市名映射成数字,这里使用hash table 名 ...
- PAT甲级1099 Build A Binary Search Tree (30分):[C++题解]建立二叉搜索树、dfs和bfs
文章目录 题目分析 题目链接 题目分析 题意重述:给定一棵二叉树的结构,和待填的数值,请将数据填到二叉树中的结点中,使之满足二叉搜索树的性质. 然后按照层序遍历输出数值. 分析: 本题分两步. 第一步 ...
- PAT甲级 1151 LCA in a Binary Tree (30分) LCA算法/C++
1151 LCA in a Binary Tree (30分) 题目大意:给出一棵树的中序和先序遍历,找到这棵树中U和V最小的共同祖先. Tips: 使用一个unordered_map记录中序遍历的值 ...
- 1115 Counting Nodes in a BST
我的DFS void DFS(Node* root){if(root==NULL)return;if(root->lchild){root->lchild->layer = root ...
最新文章
- Leangoo大讲堂:免费Scrum敏捷开发实战—武汉站
- 机房布线的最高境界……
- 安装texlive并用latex编写一段中文,最后生成pdf文件
- Mybatis Xml 传入动态字段 排序
- idea打印sql的插件_[Mybatis]-[基础支持层]-插件-自定义简易SQL打印插件
- [JavaWeb-HTML]HTML标签_表格标签
- Hadoop生态hive(一)介绍
- 玩转Jquery中的动画效果(animate方法)
- 神奇的pdfkit工具——将字符串保存为pdf文件
- 机器学习之线性回归(matlab)
- 【Antlr】Antlr 在语法中嵌入任意动作
- python numpy 技巧
- JSK-58 合法回文【字符串】
- linux503解决方法,解决nginx 503 Service Temporarily Unavailable方法示例
- Python数据解析笔记+实战
- 苹果手机电池保养再用两年!
- 基于Java的GUI界面+SQL Server数据库课程信息管理系统
- 用函数统计各分数段人数c语言,excel统计各分数段人数的函数
- 斗鱼房间信息自动化爬取
- 二、Eureka服务注册与发现
热门文章
- 缺陷漏测分析:测试过程改进
- poj 3304 Segments (几何 : 线段 直线相交)
- python 服务端渲染_客户端渲染和服务器渲染的区别
- 是否所有二分类神经网络的准确率都能无限趋近100%?
- simpledateformat 毫秒_阿里巴巴 | 为啥代码中禁用static修饰SimpleDateFormat?
- 【STM32】PWM 输出实验代码详解
- 4.7 参数 vs 超参数-深度学习-Stanford吴恩达教授
- 【viterbi维特比译码】卷积码为(2,1,7)标准卷积码和维特比译码的FPGA实现
- 代理加盟哪家小程序开发公司好
- ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler)(转)