题目描述
知识点
裸的BST
实现
码前思考
- 只需要在建树过程中保存深度就可以了,之前还多做了一次层序遍历,太蠢了!
- 任何涉及到要对树的结构进行改变的操作都需要传地址
node* &root
; NULL
也算是一棵树,是空树;- 注意左右孩子初始化为
NULL
;
代码实现
//使用二叉树建树
#include "bits/stdc++.h"
using namespace std;
const int maxn = 1010;
struct node{
int val;
int level;
node* l;
node* r;
node(int x,int lv){
val = x;
l = NULL;
r = NULL;
level = lv;
}
};
int n;
int n1;
int n2;
int data[maxn];
int depth=0;
int depths[maxn];
//插入需要传地址
void insert(node* &root,int x,int level){
if(root==NULL){
root = new node(x,level);
if(level>depth){
depth=level;
}
depths[level]++;
}else{
if(x <= root->val){
insert(root->l,x,level+1);
}else{
insert(root->r,x,level+1);
}
}
}
node* create(int data[],int n){
node* root = NULL;
for(int i=0;i<n;i++){
insert(root,data[i],1);
}
}
int main(){
//注意初始化为0
fill(depths,depths+maxn,0);
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&data[i]);
}
//然后开始建树
node* root = NULL;
root = create(data,n);
printf("%d + %d = %d",depths[depth],depths[depth-1],depths[depth]+depths[depth-1]);
return 0;
}
码后反思
- 回顾BST的删除操作怎么进行的?
二刷代码
很普通的一道题,不细做了。