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 [−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
思路分析:
要求输出BST树最下面两层的结点个数n1、n2,和n1+n2。
首先,是BST树的建树。说是建树,其实就是在树上插入结点,如果能自己写出伪代码,说明思路上就没有问题。
其次,是找出BST树最下面两层的结点个数。说到层次,就要用到层次遍历,一次层次遍历便可实现对整个树结点所属层次的初始化。最后输出可以考虑将层次遍历序列直接入栈,这样遍历完成后栈顶元素的层次即整个树的最底层n1层,那么n2层=n1层-1,接下来的操作就是不断出栈,判断是否等于n1层或者n2层即可。
#include<cstdio>
#include<iostream>
#define MAX 1010
typedef struct NODE{
int data;
int level;
struct NODE *left;
struct NODE *right;
}NODE;
int n;
int n1=0,n2=0;
void insert(NODE *&root,int data)
{
if(root==NULL)
{
root = new NODE;
root->left=NULL;
root->right=NULL;
root->data=data;
return;
}
if(data<=root->data)insert(root->left,data);
if(data>root->data)insert(root->right,data);
}
void levelorder(NODE *root)
{
NODE *que[MAX];
int front=-1,rear=-1;
NODE *stack[MAX];
int top=-1;
root->level=1;
que[++rear]=root;
while(front!=rear)
{
NODE *node=que[++front];
stack[++top]=node;
// printf("%d--%d ",node->data,node->level);
if(node->left!=NULL)
{
node->left->level=node->level+1;
que[++rear]=node->left;
}
if(node->right!=NULL)
{
node->right->level=node->level+1;
que[++rear]=node->right;
}
}
int tempTop=top;
while(top!=-1)
{
NODE *node = stack[top--];
if(node->level==stack[tempTop]->level)n1++;
if(node->level==stack[tempTop]->level-1)n2++;
}
}
int main()
{
NODE *root=NULL;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int data;
scanf("%d",&data);
insert(root,data);
}
levelorder(root);
printf("%d + %d = %d",n1,n2,n1+n2);
}