分析:一次AC的感觉真爽,BST的常规题,dfs求出层数,再用bfs遍历。
#include<stdio.h>
#include<queue>
#include<stdlib.h>
using namespace std;
typedef struct BNode{
int data, layer;
struct BNode *l, *r;
}BNode, *BTree;
BTree insert(BTree root, int num){
if(root == NULL){
root = (BTree)malloc(sizeof (BNode));
root->data = num;
root->l = root->r = NULL;
return root;
}
if(num > root->data)
root->r = insert(root->r, num);
else root->l = insert(root->l, num);
return root;
}
int findD(BTree root){
if(root == NULL) return 0;
int l = findD(root->l)+1;
int r = findD(root->r)+1;
return l > r ? l : r;
}
void bfs(BTree root){
int len = findD(root);
int layer = 1, cnt1 = 0, cnt2 = 0;
root->layer = 1;
queue<BTree> q;
q.push(root);
while(!q.empty()){
BTree cur = q.front();
q.pop();
if(cur->layer == len-1) cnt2++;
else if(cur->layer == len) cnt1++;
if(cur->l) {
cur->l->layer = cur->layer+1;
q.push(cur->l);
}
if(cur->r){
cur->r->layer = cur->layer+1;
q.push(cur->r);
}
}
printf("%d + %d = %d\n", cnt1, cnt2, cnt1+cnt2);
}
int main(){
// freopen("in.txt", "r", stdin);
int n, num, i;
BTree root = NULL;
scanf("%d", &n);
for(i = 0; i<n; i++){
scanf("%d", &num);
root = insert(root, num);
}
bfs(root);
return 0;
}