二叉搜索树 (BST) 递归定义为具有以下属性的二叉树:
- 若它的左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值
- 它的左、右子树也分别为二叉搜索树
将一系列数字按顺序插入到一个空的二叉搜索树中,然后,请你计算结果树的最低两层的结点个数。
输入格式
第一行包含整数 N,表示插入数字序列包含的数字个数。
第二行包含 N 个整数,表示插入数字序列。
输出格式
以如下格式,在一行中,输出结果树的最后两层的结点数:
n1 + n2 = n
n1
是最底层结点数量,n2
是倒数第二层结点数量,n
是它们的和。
数据范围
1≤N≤1000
−1000≤插入数字 ≤1000。
输入样例:
9
25 30 42 16 20 20 35 -5 28
输出样例:
2 + 4 = 6
思路:每插入一个结点,从根节点开始遍历,判断是否小于等于(大于)当前节点的值,如果当前节点已经有左(右)子树了,就向下遍历,直到找到个节点可以作为他的左右子节点,顺便记录一下最大深度
坑点:测试点5 如果只有一个结点的情况 输出 1 + 0 = 1
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define INF 0x3f3f3f3f
#define x first
#define y second
using namespace std;
const int N=1e6+5;
int n,m,k;
int a[N],in[N];
int l[N],r[N];
int d[N];
int mxd=-1;
void add(int root,int i,int depth){
if(a[i]<=a[root]){
if(l[root]==-1){
l[root]=i;
d[depth]++;
mxd=max(depth,mxd);
return;
}
else add(l[root],i,depth+1);
}
if(a[i]>a[root]){
if(r[root]==-1){
r[root]=i;
d[depth]++;
mxd=max(depth,mxd);
return ;
}
else add(r[root],i,depth+1);
}
}
int main(){
cin>>n;
memset(l,-1,sizeof(l));
memset(r,-1,sizeof(r));
rep(i,0,n) cin>>a[i];
d[0]++;
if(n==1){ //测试点5
cout<<"1 + 0 = 1"<<endl;
return 0;
}
rep(i,1,n) add(0,i,1);
cout<<d[mxd]<<" + "<<d[mxd-1]<<" = "<<d[mxd-1]+d[mxd]<<endl;
}