## Problem #

Source: [PAT 1115]

### Description #

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:

`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`

## Solution #

- 题意 给你二叉查找树的插入序列，你判断最深的两层一共又多少个节点
- 思路 插入时将深度也传递给节点，同时每次又更深的深度时，记录最深深度。最后输出最深两层深度节点数即可

## Code #

```
#include <iostream>
#include <unordered_map>
#include <string>
#include <math.h>
#define maxsize 20500
using namespace std;
int n, m, maxi = 0, list[maxsize] = {0};
struct Node
{
int v, height;
Node *left, *right;
};
Node *newNode(int height, int v)
{
Node *node = new Node;
node->left = node->right = NULL;
node->v = v;
if (height > maxi)
maxi = height;
list[height]++;
node->height = height;
}
void insert(Node *&node, int v, int height)
{
if (node == NULL)
node = newNode(height, v);
else if (v <= node->v)
insert(node->left, v, height + 1);
else
insert(node->right, v, height + 1);
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
cin >> n;
int tmp;
Node *root = NULL;
for (int i = 0; i < n; i++)
{
cin >> tmp;
insert(root, tmp, 1);
}
cout << list[maxi] << " + " << list[maxi - 1] << " = " << (list[maxi] + list[maxi - 1]);
return 0;
}
```