文章目录

  • 题目分析
  • 题目链接

题目分析

分析
首先本题给定的二叉搜索树的定义和其他地方的不同。本题小于等于的是左子树,右子树是大于根结点的。

然后说一下做题的思路。
给定一串数据,让构造二叉搜索树。 先想一想怎么存二叉树,想用左儿子数组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求一层结点数量相关推荐

  1. 1115 Counting Nodes in a BST (30 分)【难度: 一般 / 知识点: 构建二叉搜索树】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805355987451904 很经典的构建搜索二叉树. #include& ...

  2. 1115. Counting Nodes in a BST (30) 数据结构

    给出一颗BST树 求这个数最后两层的节点数量 用c1+c2 = n 的形式给出 建树深度搜索即可 #include<iostream> #include<cstdio> #in ...

  3. 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 ...

  4. PAT甲级1135 Is It A Red-Black Tree (30分):[C++题解]判断红黑树

    文章目录 题目分析 题目链接 题目分析 分析 给定前序遍历,同时红黑树一定是二叉搜索树,所以它的中序遍历就是从小到大排序.因此这道题是给定了前序遍历和中序遍历让建立二叉搜索树(BST). 数据结构中有 ...

  5. PAT甲级1151 LCA in a Binary Tree (30 分):[C++题解]LCA、最低公共祖先、哈希表映射

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 和下面这道题几乎是同一题:PAT甲级1143 Lowest Common Ancestor (30 分):[C++题解]LCA.最低 ...

  6. PAT甲级1087 All Roads Lead to Rome (30分):[C++题解]dijkstra求单源最短路综合、最短路条数、保存路径

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 首先这是一道dijkstra算法求最短路的题目,不过此题较为复杂.首先需要将字符串城市名映射成数字,这里使用hash table 名 ...

  7. PAT甲级1099 Build A Binary Search Tree (30分):[C++题解]建立二叉搜索树、dfs和bfs

    文章目录 题目分析 题目链接 题目分析 题意重述:给定一棵二叉树的结构,和待填的数值,请将数据填到二叉树中的结点中,使之满足二叉搜索树的性质. 然后按照层序遍历输出数值. 分析: 本题分两步. 第一步 ...

  8. PAT甲级 1151 LCA in a Binary Tree (30分) LCA算法/C++

    1151 LCA in a Binary Tree (30分) 题目大意:给出一棵树的中序和先序遍历,找到这棵树中U和V最小的共同祖先. Tips: 使用一个unordered_map记录中序遍历的值 ...

  9. 1115 Counting Nodes in a BST

    我的DFS void DFS(Node* root){if(root==NULL)return;if(root->lchild){root->lchild->layer = root ...

最新文章

  1. Leangoo大讲堂:免费Scrum敏捷开发实战—武汉站
  2. 机房布线的最高境界……
  3. 安装texlive并用latex编写一段中文,最后生成pdf文件
  4. Mybatis Xml 传入动态字段 排序
  5. idea打印sql的插件_[Mybatis]-[基础支持层]-插件-自定义简易SQL打印插件
  6. [JavaWeb-HTML]HTML标签_表格标签
  7. Hadoop生态hive(一)介绍
  8. 玩转Jquery中的动画效果(animate方法)
  9. 神奇的pdfkit工具——将字符串保存为pdf文件
  10. 机器学习之线性回归(matlab)
  11. 【Antlr】Antlr 在语法中嵌入任意动作
  12. python numpy 技巧
  13. JSK-58 合法回文【字符串】
  14. linux503解决方法,解决nginx 503 Service Temporarily Unavailable方法示例
  15. Python数据解析笔记+实战
  16. 苹果手机电池保养再用两年!
  17. 基于Java的GUI界面+SQL Server数据库课程信息管理系统
  18. 用函数统计各分数段人数c语言,excel统计各分数段人数的函数
  19. 斗鱼房间信息自动化爬取
  20. 二、Eureka服务注册与发现

热门文章

  1. 缺陷漏测分析:测试过程改进
  2. poj 3304 Segments (几何 : 线段 直线相交)
  3. python 服务端渲染_客户端渲染和服务器渲染的区别
  4. 是否所有二分类神经网络的准确率都能无限趋近100%?
  5. simpledateformat 毫秒_阿里巴巴 | 为啥代码中禁用static修饰SimpleDateFormat?
  6. 【STM32】PWM 输出实验代码详解
  7. 4.7 参数 vs 超参数-深度学习-Stanford吴恩达教授
  8. 【viterbi维特比译码】卷积码为(2,1,7)标准卷积码和维特比译码的FPGA实现
  9. 代理加盟哪家小程序开发公司好
  10. ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler)(转)