3、二叉搜索树的2层结点统计 (25 分)

二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。

将一系列数字按给定顺序插入一棵初始为空的二叉搜索树,你的任务是统计结果树中最下面 2 层的结点数。

输入格式:

输入在第一行给出一个正整数 N (≤1000),为插入数字的个数。第二行给出 N 个 [−1000,1000] 区间内的整数。数字间以空格分隔。

输出格式:

在一行中输出最下面 2 层的结点总数。

输入样例:

9
25 30 42 16 20 20 35 -5 28
输出样例:

6


思路:

关键在如何建树和如何dfs,只需要把该节点的左右存放起来就能够实现dfs,dfs只要按照从左到右,从上到下遍历即可。


#include

using namespace std;
const int N = 1e3 + 10;
int n;
int l[N],r[N],w[N],idx;
int ans[N],maxn;

//l、r数组中存放的是i的子节点的在输入中的下标
//dfs按下标逐个遍历
//每遍历一层且有子节点,那就让ans++

void build(int &u ,int x){
	if(u == 0){
		u = ++ idx;
		w[u] = x;
		return;
	}
	if(x <= w[u]) build(l[u],x);
	else build(r[u],x);
}

void dfs(int u , int d){
	if(!u) return;
	ans[d] ++;
	maxn = max(maxn,d);
	dfs(l[u],d+1);
	dfs(r[u],d+1);
}

int main(){
	cin >> n;
	int root = 0;
	for(int i = 1 ; i <= n ; i ++){
		int x;
		cin >> x;
		build(root,x);
	}
	dfs(root,0);
	printf("%d",ans[maxn-1] + ans[maxn]);
	
}

你可能感兴趣的:(算法笔记,#,DFS,c++,dfs)