标头.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);
}
}