A1115 Counting Nodes in a BST (30 point(s))

二叉查找树建树,层序

1. 原文

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 [−10001000] 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:

1
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:

1
2
9
25 30 42 16 20 20 35 -5 28

Sample output:

1
2 + 4 = 6

2. 解析

  • 建树
  • 层序

3. AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include<cstdio>
#include<queue>
using namespace std;
struct node
{
int data;
node *lchild,*rchild;
};
node* newNode(int x)
{
node* root=new node;
root->data=x;
root->lchild=root->rchild=NULL;
return root;

}
void create(int x,node* &root)
{
if (root==NULL)
{
root=newNode(x);
return;
}else if (root->data>=x)
{
create(x,root->lchild);
}else{
create(x,root->rchild);
}
}
int level=0;
int cnt[2020]={};
void bfs(node* root)
{
queue<node*> q;
q.push(root);
node* lastnode=root;
node* newnode;
while(!q.empty())
{
node* temp=q.front();
q.pop();
cnt[level]++;
if (temp->lchild!=NULL)
{
q.push(temp->lchild);
newnode=temp->lchild;
}if (temp->rchild!=NULL)
{
q.push(temp->rchild);
newnode=temp->rchild;
}
if (lastnode==temp)
{
level++;
lastnode=newnode;
}
}
}
int main()
{
int n;
scanf("%d",&n);
int a;
node* root=NULL;
for (int i = 0; i < n; ++i)
{
scanf("%d",&a);
create(a,root);
}
bfs(root);
int cnt1=cnt[level-2];
int cnt2=cnt[level-1];
printf("%d + %d = %d\n",cnt2,cnt1,cnt1+cnt2);
return 0;
}
本文结束  感谢您的阅读
  • 本文作者: Wang Ting
  • 本文链接: /zh-CN/2019/09/03/A1115/
  • 发布时间: 2019-09-03 12:29
  • 更新时间: 2021-10-29 14:08
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

Gitalking ...