PAT1115 Counting Nodes in a BST 二叉搜索树最后两层结点数量

16 篇文章 0 订阅

传送门

二叉搜索树 (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

思路:每插入一个结点,从根节点开始遍历,判断是否小于等于(大于)当前节点的值,如果当前节点已经有左(右)子树了,就向下遍历,直到找到个节点可以作为他的左右子节点,顺便记录一下最大深度 

坑点:测试点5 如果只有一个结点的情况 输出 1 + 0 = 1

#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define INF 0x3f3f3f3f
#define x first
#define y second
using namespace std;
const int N=1e6+5;
int n,m,k;
int a[N],in[N];
int l[N],r[N];
int d[N];
int mxd=-1;
void add(int root,int i,int depth){
    if(a[i]<=a[root]){
        if(l[root]==-1){
            l[root]=i;
            d[depth]++;
            mxd=max(depth,mxd);
            return;
        }
        else add(l[root],i,depth+1);
    }
    if(a[i]>a[root]){
        if(r[root]==-1){
            r[root]=i;
            d[depth]++;
            mxd=max(depth,mxd);
            return ;
        }
        else add(r[root],i,depth+1);
    }
}
int main(){
    cin>>n;
    memset(l,-1,sizeof(l));
    memset(r,-1,sizeof(r));

    rep(i,0,n) cin>>a[i];
    d[0]++;
    if(n==1){ //测试点5
        cout<<"1 + 0 = 1"<<endl;
        return 0;
    }
    rep(i,1,n) add(0,i,1);
    cout<<d[mxd]<<" + "<<d[mxd-1]<<" = "<<d[mxd-1]+d[mxd]<<endl;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值