题目链接:1115 Counting Nodes in a BST (30分)
题意
给出二叉排序树的输入序列,其中小于等于根节点的放左边,大于根节点的放右边。构建完二叉排序树够计算最下面一层的元素个数n1 ,和倒数第二层的元素个数n2,计算n1 + n2
分析
根据序列构造二叉树,然后层序遍历,计算n1,n2.
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
typedef struct Tree{
int data, level;
struct Tree *ltree, *rtree;
}Tree, *BiTree;
void add(BiTree &root, int x);
void bfs(BiTree root, int &n1, int &n2);
int questHigh(BiTree root);
int main(int argc, char** argv) {
int n, x, n1 = 0, n2 = 0;
BiTree root = NULL;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &x);
add(root, x);
}
bfs(root, n1, n2);
printf("%d + %d = %d", n1, n2, n1 + n2);
return 0;
}
void add(BiTree &root, int x) {
if (root == NULL) {
root = (BiTree) malloc(sizeof(Tree));
root->data = x;
root->ltree = root->rtree = NULL;
} else if (root->data >= x) {
add(root->ltree, x);
} else {
add(root->rtree, x);
}
}
void bfs(BiTree root, int &n1, int &n2) {
root->level = 1;
int h = questHigh(root);
queue<BiTree> que;
que.push(root);
while(!que.empty()) {
BiTree t = que.front();
que.pop();
if (t->ltree) {
t->ltree->level = t->level + 1;
que.push(t->ltree);
}
if (t->rtree) {
t->rtree->level = t->level + 1;
que.push(t->rtree);
}
if (t->level == h)
n1++;
if (t->level == h - 1)
n2++;
}
}
int questHigh(BiTree root) {
if (root == NULL)
return 0;
int l = questHigh(root->ltree);
int r = questHigh(root->rtree);
return l > r ? l + 1 : r + 1;
}