//
/*
*
*
*
* 文件名称:ID3.cpp
*
* 摘 要:ID3算法实现
*
* 当前版本:1.0
* 完成日期:2011.01.13
*/
#include <stdio.h>
#include <iostream>
#include <vector>
#include <math.h>
#include <string.h>
using namespace std;
typedef struct tnode
{
char tdata[100];
}tnode;
typedef struct Tree_Node
{
char name[100];
bool isLeaf; //标记是否叶子节点
vector<tnode> att_list;//属性名称列表
vector<Tree_Node * > child_list;
}Tree_Node,* pTreeNpde;
typedef struct dnode
{
vector<tnode>row;
}dnode;
typedef struct D_Node
{
vector<dnode>DB;
vector<tnode> attr_name;
tnode class_name;
}D_Node;
D_Node G_DB;
pTreeNpde Root = NULL;
typedef struct FreeQNode
{
char name[100];
int count;
vector<int> Set_ID;
}FreeQNode;
typedef struct FreeQNodeDouble
{
char name[100];
int count;
vector<int> row_id;
vector<FreeQNode> classes;//存放分类属性列表及相应的出现次数
}FreeQNodeDouble;
typedef struct attr_node
{
int attr_id;
vector<tnode> attr_name;
vector<int> count_list;
}attr_node;
vector<attr_node> G_Attr_List;
typedef struct binNode
{
char name[100];
int count;
vector<int> Set_ID;
struct binNode * lchild;
struct binNode * rchild;
}binNode;
typedef struct binNodeDouble
{
char name[100];
int count;
vector<int> row_id;
struct binNodeDouble * lchild;
struct binNodeDouble * rchild;
vector<FreeQNode> classes;
}binNodeDouble;
void insert_tree(binNode * & r, char str[100])
{
if (NULL == r)
{
binNode * node = new binNode;
strcpy(node->name,str);
node->count = 1;
//printf("[%s,%d]\n",node->name,node->count);
node->lchild = node->rchild = NULL;
r = node;
}
else
{
if (strcmp(r->name,str) == 0)
{
r->count ++;
}
else if (strcmp(r->name,str) < 0)
{
insert_tree(r->lchild,str);
}
else
{
insert_tree(r->rchild,str);
}
}
}
void delete_bin_tree(binNode *& r)
{
if (r != NULL)
{
delete_bin_tree(r->lchild);
delete_bin_tree(r->rchild);
delete(r);
r = NULL;
}
}
void Bin_tree_inorder(binNode * r,vector<FreeQNode> & Fq)
{
if (r != NULL)
{
Bin_tree_inorder(r->lchild,Fq);
FreeQNode ft;
//printf("%s,%d\n",r->name,r->count);
strcpy(ft.name,r->name);
ft.count = r->count;
for (int i= 0;i < r->Set_ID.size();i++)
{
ft.Set_ID.push_back(r->Set_ID[i]); //保存子集对应的ID号
}
Fq.push_back(ft); //此处少了这条语句,造成结果无法返回
Bin_tree_inorder(r->rchild,Fq);
}
}
void Get_attr(binNode * r,attr_node & attr)
{
if (r != NULL)
{
Get_attr(r->lchild,attr);
tnode t;
strcpy(t.tdata,r->name);
//printf("%s,%d\n",r->name,r->count);
attr.attr_name.push_back(t);
attr.count_list.push_back(r->count);//保存出现次数
Get_attr(r->rchild,attr);
}
}
void insert_tree_double(binNodeDouble *& r, int DB_ID,char attr_name[100],char class_name[100])
{
if (NULL == r)
{
binNodeDouble * node = new binNodeDouble;
strcpy(node->name,attr_name);
node->count = 1;
node->row_id.push_back(DB_ID);
node->lchild = node->rchild = NULL;
FreeQNode fq;
strcpy(fq.name,class_name);
fq.count = 1;
fq.Set_ID.push_back(DB_ID); //保存子集所对应的ID号
node->classes.push_back(fq);
r= node;
}
else
{
if (strcmp(r->name,attr_name) == 0)
{
r->count ++;
r->row_id.push_back(DB_ID);//这里也需要保存相应的ID号
bool found = false;
for (int i = 0; i< r->classes.size()