首页 > 其他分享 >1115 二叉搜索树最后两层结点数量

1115 二叉搜索树最后两层结点数量

时间:2023-04-21 20:34:25浏览次数:33  
标签:结点 int 二叉 1115 搜索 include dis

二叉搜索树 (BST) 递归定义为具有以下属性的二叉树:

  • 若它的左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值
  • 它的左、右子树也分别为二叉搜索树

将一系列数字按顺序插入到一个空的二叉搜索树中,然后,请你计算结果树的最低两层的结点个数。

输入格式

第一行包含整数 N,表示插入数字序列包含的数字个数。

第二行包含 N 个整数,表示插入数字序列。

输出格式

以如下格式,在一行中,输出结果树的最后两层的结点数:

n1 + n2 = n

n1 是最底层结点数量,n2 是倒数第二层结点数量,n 是它们的和。

数据范围

1≤N≤1000,
−1000≤ 插入数字 ≤1000。

输入样例:

9
25 30 42 16 20 20 35 -5 28

输出样例:

2 + 4 = 6

代码实现:

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int N=1005;
int l[N],r[N],w[N],vis[N],root,idx,max1;
int level[N];
void build(int &u,int x){
    if(!u)u=++idx,w[u]=x;
    else if(x<=w[u])build(l[u],x);
    else build(r[u],x);
}
void bfs(int x){
    queue<pair<int,int> >q;
    q.push({x,1});
    while(q.size()){
        int s=q.front().first;
        int dis=q.front().second;
        q.pop();
        if(vis[s])continue;
        vis[s]=1;
        max1=max(max1,dis);
        level[dis]++;
        if(l[s])q.push({l[s],dis+1});
        if(r[s])q.push({r[s],dis+1});
    }
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        build(root,x);
    }
    bfs(root);
    cout<<level[max1]<<" + "<<level[max1-1]<<" = "<<level[max1-1]+level[max1]<<endl;
    return 0;
}

 

标签:结点,int,二叉,1115,搜索,include,dis
From: https://www.cnblogs.com/hxss/p/17341703.html

相关文章

  • 1099 构建二叉搜索树
    二叉搜索树(BST)递归定义为具有以下属性的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值若它的右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值它的左、右子树也分别为二叉搜索树给定二叉树的具体结构以及一系列不同的整数,只有一种方法......
  • 1102 反转二叉树
    以下是来自 MaxHowell@twitter 的内容:谷歌:我们的百分之九十的工程师都使用你编写的软件,但是你连在白板上反转二叉树都做不到,还是滚吧。现在,请你证明你会反转二叉树。输入格式第一行包含一个整数 N,表示树的结点数量。所有结点编号从 0 到 N−1。接下来 N 行,每行对......
  • 数据结构 ---> 二叉树 -->堆之解析_01
    老友们好!本期将对堆之构建进行解说!相信,初学此章节的老友!!或多或少,对前一期的部分代码,有所困惑!说真的,堆的有些内容理解起来还是挺困难的!好了,废话不多讲!开始本期的解析之旅吧!希望大家都能有所收获!!下面,先看一组,上一期的图示:>那么该如何操作,才能取得前几名的数值呢?针对这点,部分老友......
  • 删除链表的倒数第 N 个结点
    删除链表的倒数第N个节点19.删除链表的倒数第N个结点-力扣(LeetCode)给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]Python解:#Definitionforsingly-linkedlist.#classListNode(object):#......
  • SDUTOJ 2128 树结构练习——排序二叉树的中序遍历
    树结构练习——排序二叉树的中序遍历TimeLimit:1000MSMemorylimit:65536K题目描述在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值(2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值(3).任意一个节......
  • 全二叉树
    全二叉树(CompleteBinaryTree)是一种特殊的二叉树,它的所有叶子节点都在同一层上,而且除了最后一层之外,其它层的节点数都达到了最大值,最后一层的节点从左到右依次排列。具有n个节点的完全二叉树,其节点编号从1到n,按照从上到下、从左到右的顺序进行编号,则有以下性质:如果一个节点的......
  • PAT Basic 1115. 裁判机
    PATBasic1115.裁判机1.题目描述:有一种数字游戏的规则如下:首先由裁判给定两个不同的正整数,然后参加游戏的几个人轮流给出正整数。要求给出的数字必须是前面已经出现的某两个正整数之差,且不能等于之前的任何一个数。游戏一直持续若干轮,中间有写重复或写错的人就出局。本题要......
  • 浅谈全局平衡二叉树
    首先,这个是GBT,不是GPT。其次,那个是ChatGPT,不是ChatGBT。原理我们先考虑一个经典的问题:单点修树上最大权独立集问题,也就是LuoguP4719【模板】"动态DP"&动态树分治。使用树剖维护矩阵可以做到\(O(n\log^2n)\)的复杂度,可以通过\(10^5\)的数据。那我们能不能把这个问题优化......
  • LeetCode Top100: 翻转二叉树(python)
    给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[] 提示:树中节点数目范围在 [0,100] 内-100<=Node.val<=100实......
  • LeetCode Top 100: 二叉树的直径 (python)
     给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。 示例:给定二叉树1/\23/\45返回 3,它的长度是路径[4,2,1,3]......