建立静态BST树的时候,不能使用结点的数值作为结点标号,因为会有重复数值,会进入死循环
应当自己将结点标号依次序分给每个结点 结点数值用data属性记录
插入遍历的时候传入并标记了深度,同时用Level数组记录每层结点数。
28分错误代码:
#include<iostream>
#include<vector>
using namespace std;
struct node{
int l=-1;
int r=-1;
}Node[2005];
int lowest=1;
int Level[1005]={0};
void insert(int index,int num,int level){
if(num>index&&Node[index].r==-1){
Node[index].r=num;
level++;
Level[level]++;
if(level>lowest) lowest=level;
return;
}else if(num>index&&Node[index].r!=-1){
insert(Node[index].r,num,level+1);
}else if(num<=index&&Node[index].l==-1){
Node[index].l=num;
level++;
Level[level]++;
if(level>lowest) lowest=level;
return;
}else if(num<=index&&Node[index].l!=-1){
insert(Node[index].l,num,level+1);
}
}
int main(){
int N;
cin>>N;
int root;
cin>>root;
root+=1000;
Level[1]=1;
for(int i=0;i<N-1;i++){
int num;
scanf("%d",&num);
num+=1000;
insert(root,num,1);
}
printf("%d + %d = %d\n",Level[lowest],Level[lowest-1],Level[lowest]+Level[lowest-1]);
return 0;
}
30分 AC代码
#include<iostream>
#include<vector>
using namespace std;
struct node{
int data;
int l=-1;
int r=-1;
}Node[1005];
int lowest=1;
int Level[1005]={0};
void insert(int index,int i,int level){
if(Node[i].data>Node[index].data&&Node[index].r==-1){
Node[index].r=i;
level++;
Level[level]++;
if(level>lowest) lowest=level;
return;
}else if(Node[i].data>Node[index].data&&Node[index].r!=-1){
insert(Node[index].r,i,level+1);
}else if(Node[i].data<=Node[index].data&&Node[index].l==-1){
Node[index].l=i;
level++;
Level[level]++;
if(level>lowest) lowest=level;
return;
}else if(Node[i].data<=Node[index].data&&Node[index].l!=-1){
insert(Node[index].l,i,level+1);
}
}
int main(){
int N;
cin>>N;
scanf("%d",&Node[0].data);
Level[1]=1;
for(int i=1;i<N;i++){
scanf("%d",&Node[i].data);
insert(0,i,1);
}
printf("%d + %d = %d\n",Level[lowest],Level[lowest-1],Level[lowest]+Level[lowest-1]);
return 0;
}
两者区别在于前者因为了静态二叉树的惯性思维,直接将数值作为结点标号,但BST中有相同数值结点的情况,一旦出现多个相同数值结点便会陷入死循环。
后者将0到N-1的标号依次发给各个结点,避免了之前的情况,也节省了空间。