D. 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 28Sample Output:
2 + 4 = 6
总共4个题目,前2题很简单,第3题数据结构建立的好也比较方便,而且题目也很考验基础;第4题用到大量指针操作(用数组无法处理负数)
4个题目如果在规定时间内都能写出来,能力也是相当不错的;
题意:给你个序列,让其插入到bst中,考察点1:bst的构建和插入;
然后将其遍历输出最下面一层和倒数第二层的节点数 考察点2:树的层序遍历,及指针的操作(bfs的指针操作)
因为没有oj平台,所以不知道是否ac,代码可以通过样例;
#include <stdio.h> #include <iostream> #include <string.h> #include <queue> using namespace std; struct bst{ int data; bst *left; bst *right; }*bbshu; int level[1000]={0}; int height=0; bst* inser(int k,bst *p) { if(!p) { p=new bst; p->data=k; p->right=p->left=NULL; }else if(p->data>=k) { p->left=inser(k,p->left); } else if(p->data<k) { p->right=inser(k,p->right); } return p; } //树的层序遍历,就是bfs,用指针写的 void bfs(bst *p) { queue<bst*> Q; if(!p) return; Q.push(p); height=0; bst* last=p; bst* tail=p; level[height]=1; height=1; while(!Q.empty()) { bst* temp=Q.front(); if(temp==NULL) break; int k=temp->data; if(temp->left!=NULL) { Q.push(temp->left); level[height]++; } if(temp->right!=NULL) { Q.push(temp->right); level[height]++; } Q.pop(); if(k==tail->data) { tail=Q.back(); last=tail; height++; } } } int main() { int k; cin>>k; bbshu=NULL; bst *point=bbshu; for(int i=0;i<k;i++) { int num; cin>>num; point=inser(num,point); } bfs(point); int k1=level[height-2]; int k2=level[height-3]; cout<<k1<<" + "<<k2<<" = "<<k1+k2<<endl; return 0; }