首页 > 编程语言 >PAT甲级-1115 Counting Nodes in a Binary Search Tree

PAT甲级-1115 Counting Nodes in a Binary Search Tree

时间:2024-09-25 21:19:16浏览次数:3  
标签:lchild Binary Search PAT int num rchild root 节点

题目

 题目大意

给定节点个数,以及每个节点的值,要求构造一棵二叉排序(搜索)树,并按照规定格式输出最后一层和倒数第二层的节点个数。

思路

二叉排序树的构造方法是递归,但思路类似于二分查找。逐个将n个节点插入到二叉排序树中,插入完成也就构造完成了。插入节点时,如果该节点值大于根节点,那么将它放入根节点的右子树中找,如果小于根节点,放入左子树,如此循环,直到找到一个空位置插入。

求最后一层的节点个数lowest和倒数第二层lower,可以先用dfs求出树的深度deep,顺便求lowest,再拿着deep用另一个dfs求lower。为了防止重复遍历,当递归层数num等于deep - 1时,就要return返回。

代码

#include <iostream>
using namespace std;

struct node{
    int data;
    node * lchild, * rchild;
};
int n, lower = 0, lowest = 0, deep = 0;

void buildTree(node * &root, int num){
    if (root == nullptr){
        root = new node();
        root->data = num;
        root->lchild = root->rchild = nullptr;
    }else{
        if (num > root->data){
            buildTree(root->rchild, num);
        }else{
            buildTree(root->lchild, num);
        }
    }
}  // 构建二叉排序树(二叉搜索树)

void dfs(node * root, int num){
    if (root->lchild == nullptr && root->rchild == nullptr){
        if (deep == num){
            lowest++;
        }else if (deep < num){
            deep = num;
            lowest = 1;
        }
    }else{
        if (root->lchild){
            dfs(root->lchild, num + 1);
        }
        if (root->rchild){
            dfs(root->rchild, num + 1);
        }
    }
}  // dfs得到总深度和最后一层的节点个数

void findLower(node * root, int num){
    if (num == deep - 1){
        lower++;
        return;  // 达到目标深度就return,以防重复遍历!!!
    }
    if (root->lchild){
        findLower(root->lchild, num + 1);
    }
    if (root->rchild){
        findLower(root->rchild, num + 1);
    }
}  // 已知总深度求目标深度的节点个数

int main(){
    cin >> n;
    node * root = nullptr;
    for (int i = 0; i < n; i++){
        int num;
        cin >> num;
        buildTree(root, num);
    }
    dfs(root, 0);
    findLower(root, 0);
    cout << lowest << " + " << lower << " = " << lowest + lower << endl;

    return 0;
}

标签:lchild,Binary,Search,PAT,int,num,rchild,root,节点
From: https://blog.csdn.net/weixin_74092648/article/details/142533376

相关文章

  • Elasticsearch基本概念及底层 【总结】
    随着业务的增长,数据与日俱增,这时为用户带来丰富的、便捷的搜索功能就迫在眉睫了。传统的数据库在处理文本搜索、模糊查询、海量数据统计分析的时候总会力不从心,所以在处理这些复杂的搜索需求时,我们更倾向于使用Elasticsearch搜索引擎。Elasticsearch是一个分布式、RESTf......
  • Elasticsearch知识整理(包含与mongoDb的区别)
    Elasticsearch概念整理Elasticsearch是位于ElasticStack核心的分布式搜索和分析引擎。Logstash和Beats有助于收集、聚合和丰富您的数据并将其存储在Elasticsearch中。Kibana使您能够以交互方式探索、可视化和分享对数据的见解,并管理和监控堆栈。Elasticsearch......
  • git: 报错: no submodule mapping found in .gitmodules for path/位于未检出的子模组
    一,问题的现象:1,安装laravel/ui这个第三方库后,它的文件不出现在未跟踪文件中,如下:liuhongdi@lhdpc:/web/api/vendor/laravel/ui$gitls-files./liuhongdi@lhdpc:/web/api/vendor/laravel/ui$gitls-files././liuhongdi@lhdpc:/web/api/vendor/laravel/ui$lsauth-backe......
  • Elasticsearch 实战应用详解
    Elasticsearch是一个分布式搜索和分析引擎,广泛应用于各种场景,如全文搜索、日志与事件数据分析、实时数据流处理等。本文将详细介绍如何在实际项目中使用Elasticsearch,包括安装配置、基本操作、高级查询及优化策略。1.安装和配置安装Elasticsearch通过官方包管理器安装......
  • XPath【详细解读,持续更新中】
    目录XPath是什么呢?Xpath的核心功能与特点XPath的应用XPath中的路径表达式与节点以及相关语法XPath中的节点XPath中的其他节点术语节点间的关系XPath路径表达式的语法选取节点谓语(Predicates)选取未知节点选取若干路径XPath中的轴(Axes)  轴的相关案例XPath运算......
  • 【Elasticsearch系列七】索引 crud
    ......
  • elastic search后端安装方法(服务端)
    要在本地安装Elasticsearch,你需要先安装JavaJDK。Elasticsearch需要Java8或更高版本。以下是详细的安装步骤:###1.安装JavaJDK####1.1下载JavaJDK你可以从Oracle官网或OpenJDK官网下载JavaJDK。以下是下载OpenJDK的步骤:1.访问[OpenJDK官网](https......
  • 【Elasticsearch系列十三】Elastic Stack
    ......
  • SimpleAISearch:C# + DuckDuckGo 实现简单的AI搜索
    SimpleAISearch:C#+DuckDuckGo实现简单的AI搜索 合集-C#(79)  最近AI搜索很火爆,有Perplexity、秘塔AI、MindSearch、Perplexica、memfree、khoj等等。在使用大语言模型的过程中,或许你也遇到了这种局限,就是无法获取网上最新的信息,导致回答的内容不是基于最新的信......
  • Redisearch 入门指南构建高性能搜索应用
    1.概述Redisearch是一个强大的全文搜索引擎,基于流行的Redis数据库构建,专为高效的数据检索而设计。它结合了Redis的快速存储能力和搜索引擎的复杂查询功能,使得开发者能够在海量数据中实现实时搜索体验。Redisearch支持丰富的特性,包括模糊匹配、布尔搜索、聚合、地理......