二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。
将一系列数字按给定顺序插入一棵初始为空的二叉搜索树,你的任务是统计结果树中最下面 2 层的结点数。
输入格式:输入在第一行给出一个正整数 N (≤1000),为插入数字的个数。第二行给出 N 个 [−1000,1000] 区间内的整数。数字间以空格分隔。
输出格式:在一行中输出最下面 2 层的结点总数。
输入样例:
9
25 30 42 16 20 20 35 -5 28
输出样例:
6
思路
本题就是直接考察了一个数据结构,这个树如果用数组模拟的话会炸,所以还是要用这种指针的思想去做。
代码
结构体实现
#include <iostream>
using namespace std;
const int N = 1010;
int n, cnt, max_deep;
struct node {
int l, r, v, deep;
bool st;
}nodes[N];
void insert(int x, int u, int d) {
// 如果当前的节点为空就插入当前节点
if (!nodes[u].st) {
nodes[u].v = x;
nodes[u].deep = d;
max_deep = max(max_deep, d);
nodes[u].st = true;
return;
}
// 查找左子树与右子树
if (x > nodes[u].v) {
if (!nodes[u].r) [u].r = ++ cnt;
insert(x, nodes[u].r, d + 1);
} else {
if (!nodes[u].l) [u].l = ++ cnt ;
insert(x, nodes[u].l, d + 1);
}
}
int main() {
cin >> n;
// 建树
for (int i = 0; i < n ;i ++ ) {
int x;
cin >> x;
insert(x, 0, 0);
}
int ans = 0;
// 统计答案
for (int i = 0; i <= cnt; i ++ )
if (nodes[i].deep >= max_deep - 1)
ans ++ ;
cout << ans;
}
整活代码
#include<iostream>
#define f(n)for(int i=0;i<n;i++)
#define y z[u]
int n,c,m,x,a;struct{int l,r,v,d,s;}z[1010];
void t(int u,int d){if(!y.s){y.v=x,y.d=d,y.s=1,m=std::max(m,d);return;}
if(x>y.v){if(!y.r)y.r=++c;t(y.r,d+1);}else{if(!y.l)y.l=++c;t(y.l,d+1);}}
int main(){std::cin>>n;f(n)std::cin>>x,t(0, 0);f(c+1)if(z[i].d>=m-1)a++;std::cout<<a;}
标签:结点,202,int,max,C++,++,L4,deep,nodes
From: https://blog.csdn.net/chq66666/article/details/139232058