SecondSearchOptionalTree

#define N 9
#include<stdio.h>
#include<stdlib.h>
#include<stack>
struct ElemType{
	char key;
	int weight;
};
struct SSTable{
	ElemType *elem;
	int length;
};
typedef struct BiTNode{
	ElemType e;
	BiTNode* lchild;
	BiTNode* rchild;
}*SOSTree;
void CreateSSTable(SSTable &st,ElemType R[],int len){
	st.elem=(ElemType*)malloc(sizeof(ElemType)*(len+1));
	if(!st.elem){
		printf("内存分配失败\n");
		return;
	}
	st.length=len;
	for(int i=1;i<=len;i++)
		st.elem[i]=R[i-1];
}
void findSW(int sw[],SSTable st){
	sw[0]=0;
	for(int i=1;i<=st.length;i++)
		sw[i]=sw[i-1]+st.elem[i].weight;
}
bool Search(SOSTree T,int key){
	if(T==NULL)
		return false;
	while(T){
		if(T->e.key==key)
		{
			printf("%3c%3d\n",T->e.key,T->e.weight);
			return true;

		}
		if(T->e.key>key)
			T=T->lchild;
		else 
			T=T->rchild;
	}
	return false;
}
void SecondOptional(SOSTree &T,ElemType elem[],int sw[],int low,int high){
	int i=low;
	int min=abs(sw[high]-sw[low]);
	int dw=sw[high]+sw[low-1];
	for(int j=low+1;j<=high;j++){
		if(abs(dw-sw[j]-sw[j-1])<min){
			i=j;
			min=dw-sw[j]-sw[j-1];
		}
	}
	T=(BiTNode*)malloc(sizeof(BiTNode));
	T->e=elem[i];
	if(i==low)
		T->lchild=NULL;
	else SecondOptional(T->lchild,elem,sw,low,i-1);
	if(i==high)
		T->rchild=NULL;
	else SecondOptional(T->rchild,elem,sw,i+1,high);
}
void CreateSOSTable(SOSTree &T,SSTable st){
	int sw[N+1];
	if(st.length==0)
		T=NULL;
	else{
		findSW(sw,st);
		SecondOptional(T,st.elem,sw,1,st.length);
	}
}
void PreOrderTraverse(SOSTree T){
	std::stack<SOSTree> stack;
	while(T||!stack.empty()){
		if(T){
			printf("%3c%3d",T->e.key,T->e.weight);
			stack.push(T);
			T=T->lchild;
		}
		else{
			T=stack.top();
			stack.pop();
			T=T->rchild;
		}
	}
}
void main(){
	SSTable st={NULL,0};
	SOSTree T=NULL;
	char s;
	ElemType R[N]={{'A',1},{'B',1},{'C',2},{'D',5},{'E',3},{'F',4},{'G',4},{'H',3},{'I',5}};
	CreateSSTable(st,R,N);
	CreateSOSTable(T,st);
	PreOrderTraverse(T);
	printf("\n请输入要查找的元素\n");
	scanf("%c",&s);
	bool flag=Search(T,s);
	if(!flag) printf("查找关键字不存在");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值