1115 Counting Nodes in a BST (30分)

A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:

  • The left subtree of a node contains only nodes with keys less than or equal to the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

Insert a sequence of numbers into an initially empty binary search tree. Then you are supposed to count the total number of nodes in the lowest 2 levels of the resulting tree.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤1000) which is the size of the input sequence. Then given in the next line are the N integers in [−1000,1000] which are supposed to be inserted into an initially empty binary search tree.

Output Specification:

For each case, print in one line the numbers of nodes in the lowest 2 levels of the resulting tree in the format:

n1 + n2 = n

where n1 is the number of nodes in the lowest level, n2 is that of the level above, and n is the sum.

Sample Input:

9
25 30 42 16 20 20 35 -5 28

Sample Output:

2 + 4 = 6

题目描述:二叉搜索树的特点有:

1)左子结点的值小于或等于根节点的值

2)右子结点的值大于根节点的值

3)所有左子树和右子树都是一个二叉搜索树

现在给出一组数,插入二叉搜索树中,求倒数第一层、倒数第二层的结点数,n1和n2,最后输出n1+n2。


解题思路:利用结构体建一棵二叉搜索树,再利用bfs将树的每一层结点分别存入vector数组中,很快就能得到结果了。写程序要有意识的将程序分块,不能将所有代码都写在主程序。


#include<bits/stdc++.h>
using namespace std;
int n, k;
const int maxn = 1e4+5;
vector<int> v[maxn];
struct node{
	int num;
	node *l, *r;
	node(){
		l = r = NULL;
	}
};
node* build(node *tree, int x){
	if(tree==NULL){
		tree = new node();
		tree->num = x;
		tree->l = tree->r = NULL;
	}
	else if(tree->num<x){
		tree->r = build(tree->r,x);
	}
	else tree->l = build(tree->l,x);
	return tree;
}

void bfs(node *tree){
	int cnt = 0;
	queue<pair<node*,int> > q;
	pair<node*,int> t, tt;
	t.first = tree;
	t.second = 0;
	q.push(t);
	while(!q.empty()){
		t = q.front(); q.pop();
		cnt = t.second;
		v[t.second].push_back(t.first->num);
		if(t.first->l!=NULL){
			tt.first = t.first->l;
			tt.second = t.second+1;
			q.push(tt);
		}
		if(t.first->r!=NULL){
			tt.first = t.first->r;
			tt.second = t.second+1;
			q.push(tt);
		}
	}
	int n1 = v[cnt].size(), n2 = v[cnt-1].size();
	printf("%d + %d = %d\n", n1, n2, n1+n2);
}

int main()
{
	node *tree = NULL;
	scanf("%d", &n);
	for(int i=0; i<n; i++){
		scanf("%d", &k);
		tree = build(tree,k);
	}
	bfs(tree);
	return 0;
}