• 二叉搜索树的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
  • 相关阅读:
    JAVA基础语法练习(四)--File 及IO流
    JAVA基础语法练习(三)
    JAVA基础语法练习(二)
    JAVA基础语法练习(一)
    python 面向对象的进阶
    python面向对象基础编程
    Linux远程
    Linux系统的安装、启动及简单的命令使用
    操作系统的结构及发展历史
    操作系统简介
  • 原文地址:https://www.cnblogs.com/Lewis28/p/14495261.html
Copyright © 2020-2023  润新知