数据结构_查找_静态查找数表_构造次优查找树

数据结构_查找_静态查找数表_构造次优查找树

SecondOptimal.h

#include<iostream>
using namespace std;

#define MAX_DATA_NUM 20//最大节点值

typedef struct SSTable //静态查找表存储结构
{
	char name;
	int weight;
} ElemType;

typedef struct BiTreeNode //二叉链表存储结构
{
	ElemType data;
	BiTreeNode *lchild, *rchild;
	BiTreeNode()
	{
		lchild = rchild = NULL;
	}
} *BiTree;

class SOSTree //静态查找树表
{
public:
	SOSTree(); //构造函数
	void SOSTREE(); //接口函数
private:
	void Findsw(); //得到权值和
	void GetSSTable(); //得到静态查找表
	void SecondOptimal(BiTree&, int, int); //得到次优查找树
	void SOSTreeTraverse(BiTree&); //遍历次优查找树
	ElemType r[MAX_DATA_NUM]; //静态查找表
	int sw[MAX_DATA_NUM]; //累计权值和
	int datanum; //表节点数量
};

SOSTree::SOSTree()
{
	datanum = 0;
}

void SOSTree::SOSTREE() //接口函数
{
	BiTree T;
	GetSSTable(); //得到静态查找表
	Findsw(); //得到累计权值和
	SecondOptimal(T, 0, datanum - 1); //得到次优查找树
	SOSTreeTraverse(T); //遍历次优查找树
}

void SOSTree::GetSSTable() //得到静态查找表
{
	cout << "Please Input The SSTable :" << endl << "name weight" << endl;
	char name;
	int weight;
	while (cin >> name >> weight)
	{
		r[datanum].name = name;
		r[datanum].weight = weight;
		datanum++;
	}
	cin.clear();
}

void SOSTree::Findsw() //得到累计权值和
{
	sw[0] = r[0].weight;
	for (int i = 1; i < datanum; i++)
		sw[i] = sw[i - 1] + r[i].weight;
}

void SOSTree::SecondOptimal(BiTree &t, int low, int high) //得到次优查找树
{
	//由有序表r[low,high]及其累计权值和表sw递归建立次优查找树
	int i = low, min = abs(sw[high] - sw[low]); //初始化
	int dw = sw[high] + ((low == 0) ? 0 : sw[low - 1]);
	for (int j = low + 1; j <= high; j++) //找到最小的Δpi
		if (abs(dw - sw[j] - sw[j - 1]) < min)
		{
			i = j;
			min = abs(dw - sw[j] - sw[j - 1]);
		}
	t = new BiTreeNode; //建立新节点
	t->data = r[i];
	if (i == low)
		t->lchild = NULL;
	else
		SecondOptimal(t->lchild, low, i - 1);
	if (i == high)
		t->rchild = NULL;
	else
		SecondOptimal(t->rchild, i + 1, high);
}

void SOSTree::SOSTreeTraverse(BiTree &t) //遍历次优查找树
{
	if (t == NULL)
		return;
	cout << t->data.name << " " << t->data.weight << endl;
	SOSTreeTraverse(t->lchild);
	SOSTreeTraverse(t->rchild);
}

main.cpp

#include"SecondOptimal.h"
 
int main()
{
	SOSTree T;
	T.SOSTREE();
	system("pause");
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注