题目大意
给定一颗二叉搜索树的插入序列,计算最后两层的节点个数
算法思路
首先我们将这n个数字依次插入到二叉搜索树中,然后使用层序遍历获取每一层节点的数目和最大层数maxLevel,L[maxLevel],L[maxLevel-1]就是最后一层和倒数第二层的节点个数
提交结果
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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。