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
原文地址:https://www.cnblogs.com/chenxiwenruo/p/6131734.html