数据结构造轮子6-----静态次优查找树

标头.h

#pragma once
#include "string"

using namespace std;

class SecondOptimalTree
{
public:
	struct elem
	{
		string name;
		int weight;
	};
	elem * elem_data;
	int elem_length;
	int * sigma_weight;

	struct tree_node
	{
		elem data;
		tree_node * lchild;
		tree_node * rchild;
	}*root;

	void InitData();
	void CalculateSigmaWeight();
	void CreateTree(tree_node * & root, int low, int high);
	void ShowTree(tree_node * root);
};

源.cpp

#include "stdafx.h"
#include "标头.h"
#include "iostream"
#include "math.h"

using namespace std;

void SecondOptimalTree::InitData()
{
	cout << "elem_length:";
	cin >> elem_length;
	elem_data = new elem[elem_length];
	sigma_weight = new int[elem_length];

	int i;
	for (i = 0;i < elem_length;i++)
	{
		cout << "elem_name:";
		cin >> elem_data[i].name;
		cout << "elem_weight:";
		cin >> elem_data[i].weight;

		sigma_weight[i] = 0;
	}

	//排序
	int j;
	elem temp;
	for (i = 0;i < elem_length;i++)
	{
		for (j = i + 1;j < elem_length;j++)
		{
			if (elem_data[i].weight > elem_data[j].weight)
			{
				temp = elem_data[i];

				elem_data[i] = elem_data[j];
				elem_data[j] = temp;
			}
		}
	}
}

void SecondOptimalTree::CalculateSigmaWeight()
{
	int i, j;
	for (i = 0;i < elem_length;i++)
	{
		for (j = 0;j <= i;j++)
		{
			sigma_weight[i] += elem_data[j].weight;
		}
	}
}

void SecondOptimalTree::CreateTree(tree_node * & root, int low, int high)
{

	int min = abs(sigma_weight[high] - sigma_weight[low]);
	int dw = sigma_weight[high];
	int mid = low;
	int i;
	for (i = low + 1;i <= high;i++)
	{
		if (min > abs(dw - sigma_weight[i] - sigma_weight[i - 1]))
		{
			mid = i;
			min = abs(dw - sigma_weight[i] - sigma_weight[i - 1]);
		}
	}
	root = new tree_node();
	root->data = elem_data[mid];
	if (mid == low)
	{
		root->lchild = NULL;
	}
	else
	{
		CreateTree(root->lchild, low, mid - 1);
	}
	if (mid == high)
	{
		root->rchild = NULL;
	}
	else
	{
		CreateTree(root->rchild, mid + 1, high);
	}
}

void SecondOptimalTree::ShowTree(tree_node * root)
{
	if (root != NULL)
	{
		cout << root->data.name << endl;
		ShowTree(root->lchild);
		ShowTree(root->rchild); 
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值