1

题目大意

给定一颗二叉搜索树的插入序列,计算最后两层的节点个数

算法思路

首先我们将这n个数字依次插入到二叉搜索树中,然后使用层序遍历获取每一层节点的数目和最大层数maxLevel,L[maxLevel],L[maxLevel-1]就是最后一层和倒数第二层的节点个数

提交结果

image.png

AC代码

#include<cstdio>
#include<algorithm>
#include<queue>

using namespace std;

struct Node{
    int val;
    Node* left;
    Node* right;
    int level;
};

/// 将x插入到root中
void insert(Node* &root,int x){
    if(root== nullptr){
        root = new Node;
        root->val = x;
        root->left = nullptr;
        root->right = nullptr;
        return;
    }
    if(root->val<x){
        insert(root->right,x);
    }else{
        insert(root->left,x);
    }
}

// 根据数组arr建树
Node* createTree(int arr[],int n){
    Node* root = nullptr;
    for(int i=0;i<n;++i){
        insert(root,arr[i]);
    }
    return root;
}

int L[1000];// 每一层的节点个数
int maxLevel = -1;

void layerOrder(Node* root){
    queue<Node*> que;
    root->level = 1;
    que.push(root);
    while(!que.empty()){
        Node* t = que.front();
        que.pop();
        maxLevel = max(maxLevel,t->level);
        ++L[t->level];
        if(t->left){
            t->left->level = t->level + 1;
            que.push(t->left);
        }
        if(t->right){
            t->right->level = t->level + 1;
            que.push(t->right);
        }
    }
}

int main() {
    int n;
    scanf("%d",&n);
    int initial[n];
    for(int i=0;i<n;++i){
        scanf("%d",&initial[i]);
    }
    Node* root = createTree(initial,n);
    layerOrder(root);
    printf("%d + %d = %d",L[maxLevel],L[maxLevel-1],L[maxLevel-1]+L[maxLevel]);
    return 0;
}

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得