PAT A 1115 AC代码

建立静态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的标号依次发给各个结点,避免了之前的情况,也节省了空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值