zoukankan      html  css  js  c++  java
  • PAT甲题题解-1115. Counting Nodes in a BST (30)-(构建二分搜索树+dfs)

    题意:给出一个序列,构建二叉搜索树(BST),输出二叉搜索树最后两层的节点个数n1和n2,以及他们的和sum:

    n1 + n2 = sum

    递归建树,然后再dfs求出最大层数,接着再dfs计算出最后两层的节点个数,也可以直接一遍dfs,顺便存储各个层的节点数。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <string.h>
    #define LEFT 1
    #define RIGHT 2
    using namespace std;
    /*
    建立BST,两次dfs
    一开始直接用index表示二叉树
    即节点i的左孩子为2*i,右孩子为2*i+1
    但是这样就会导致超出存储大小。。。
    */
    const int maxn=1000+5; //一开始设置成了1000导致段错误
    int a[maxn];
    int maxlayer=0;
    int n1=0,n2=0;
    int cnt;
    struct Node{
        int left=-1,right=-1;
        int id=-1;
        int value;
    }node[maxn];
    /*
    root is the current node
    val is the value of root
    fa is the father node of root
    LR tells that root is left or right child of fa
    */
    void insertBST(int root,int val,int fa,int LR){
        if(root==-1){
            cnt++;
            node[cnt].value=val;
            if(LR==LEFT){
                node[fa].left=cnt;
            }
            else{
                node[fa].right=cnt;
            }
            return;
        }
        if(val<=node[root].value){
            insertBST(node[root].left,val,root,LEFT);
        }
        else{
            insertBST(node[root].right,val,root,RIGHT);
        }
    }
    void dfs(int root,int layer){
        if(root==-1){
            maxlayer=max(maxlayer,layer-1);
            return;
        }
        dfs(node[root].left,layer+1);
        dfs(node[root].right,layer+1);
    }
    
    void dfsAns(int root,int layer){
        if(root==-1){
            return;
        }
        if(layer==maxlayer){
            n1++;
        }
        if(layer==maxlayer-1){
            n2++;
        }
        dfsAns(node[root].left,layer+1);
        dfsAns(node[root].right,layer+1);
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        int a;
        memset(node,-1,sizeof(node));
        scanf("%d",&a);
        node[1].value=a;
        cnt=1;
        for(int i=1;i<n;i++){
            scanf("%d",&a);
            insertBST(1,a,-1,-1);
        }
        dfs(1,1);
        dfsAns(1,1);
        printf("%d + %d = %d",n1,n2,n1+n2);
        return 0;
    }
    View Code
  • 相关阅读:
    JavaScript在Javascript中为String对象添加trim,ltrim,rtrim方法
    JavaScriptjs写的俄罗斯方块
    WinForm中“嵌入的资源”和“资源文件”数据的获取方式
    Facade模式(外观模式)
    windows服务安装程序中如何安装后自动启动
    水晶报表之主从多表数据源批量预览及打印开发设计
    IP地址分类简介
    水晶报表之各节的作用
    水晶报表开发之常用代码以及注意事项
    .Net中后台线程和前台线程的区别
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/6131734.html
Copyright © 2011-2022 走看看