• 二叉搜索树的2层结点统计 (25 分)


    二叉搜索树的2层结点统计 (25 分)
     

    二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。

    将一系列数字按给定顺序插入一棵初始为空的二叉搜索树,你的任务是统计结果树中最下面 2 层的结点数。

    输入格式:输入在第一行给出一个正整数 N (≤),为插入数字的个数。第二行给出 N 个 [ 区间内的整数。数字间以空格分隔。

    输出格式:在一行中输出最下面 2 层的结点总数。

    输入样例:9 25 30 42 16 20 20 35 -5 28 输出样例:6


     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int l[1005],r[1005],a[1005];
     4 int num[1005],max_d,n,x;
     5 void dfs(int root,int pos,int depth){
     6     if(a[pos] <= a[root]){
     7         if(l[root]==0x3f3f3f3f){
     8             l[root]=pos;
     9             num[depth+1]++;
    10             max_d=max(max_d,depth+1);
    11         }else{
    12             dfs(l[root],pos,depth+1);
    13 
    14         }
    15     }else{
    16         if(r[root]==0x3f3f3f3f){
    17             r[root]=pos;
    18             num[depth+1]++;
    19             max_d=max(max_d,depth+1);
    20         }else{
    21             dfs(r[root],pos,depth+1);
    22         }
    23     }
    24 }
    25 int main(){
    26     memset(l,0x3f3f3f3f,sizeof l);
    27     memset(r,0x3f3f3f3f,sizeof r);
    28 
    29     cin>>n;
    30     if(n==1){
    31         cout<<"1"<<endl;
    32         return 0;
    33     }
    34     for(int i=0;i<n;i++){
    35         cin>>x;
    36         if(!i) a[i]=x;
    37         else{
    38             a[i]=x;
    39             dfs(0,i,0);
    40         }
    41     }
    42     cout<<num[max_d-1]+num[max_d];
    43     return 0;
    44 }
    View Code
  • 相关阅读:
    javascript Object的长度
    java新手笔记9 类的封装示例
    java新手笔记8 包
    java新手笔记7 找最小、最大、排序
    jdk8 新特性
    Spring Boot: 加密应用配置文件敏感信息
    并发之Fork/Join框架使用及注意点
    Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore
    spring 事件监听器
    观察者模式(订阅模式)
  • 原文地址:https://www.cnblogs.com/Lewis28/p/14495261.html
Copyright © 2020-2023  润新知