//////////////////////////////////////////////////////////////////////
// tree.h: definitons of the GloK_tree and K_tree classes.
//
//////////////////////////////////////////////////////////////////////

#include "node.h"
#include "data.h"
#include "fsout.h"

struct KeyHashNode;
struct CloseHashNode;
class FK_tree;


class GloK_tree
{
public:
	GK_node* Root;
	GK_node** header; //header table

	GK_node* negStart;
	GK_node* negEnd; //do i need this?

	//new idea
	//GK_node** sibList;
	//int sibLen;

	int* enumList;
	int enumLen;

	void init(int itemno);
	~GloK_tree();

	GK_node* insertKey(int* keySet, int len, int support, int index=-1); //insert key patterns into tree;
	GK_node* insertNBG(int* keySet, int len, int support, int index=-1); //insert NBG patterns into tree;
	
	int outputKeys(FSout *fsout, FSout* fsoutNGB, double& keyNum);
	int outputNGB(FSout *fsout); //for debug
	
	GK_node* findKey(int* keySet, int klen);

	int genNewKeyfrNGB(FK_tree* tree);

	int enumNewKey(GK_node* curr, KeyHashNode* knode, FK_tree* tree, int*& closet, int& clen);
private:
	
};


class K_tree{
public:
	K_node* Root;
	K_node* header; //e link list of keys

private:
	int cindex; //index of associated closed pattern
	//int support;

	K_node* expandKey(K_node* current, K_node* previous, int* diffSet, int dlen);
	bool isSuperset(K_node* exception = NULL); //note: exception is not necessary

	int genNewKeys(K_node* keyNode, int* keySet, int klen, int ksupp); //enumerate new keys
	int genNewKeys(K_node* keyNode, int* keySet, int klen, CloseHashNode* closeNode); //enumerate new keys

	int removeKey(K_node* keyNode); //remove splitted out key
	
	K_node* findKey(int* keySet, int klen);

public:
	
	void init(int index);
	~K_tree();

	K_node* insertKey(int* keySet, int len); //insert key patterns into tree;
	
	int outputKeys(FSout *fsout, int maxlen);

	int splitKey(int* keySet, int klen, int ksupp);
	int splitKey(int* keySet, int klen, CloseHashNode* closeNode);
	void setCindex(int index) {cindex = index;}
};

class C_tree{
public:
	C_node* Root;
	C_node** header; //header table

private:
	bool mergeWsubset(int* closeSet, int len, CloseHashNode* chnode, int index); //merge subsets of closed patterns to closed patterns
	bool merge2supset(int* closeSet, int len, CloseHashNode* chnode, int index); //merge closed pattern to its superset

public:
	void init(int totalItemNo);
	~C_tree();

	C_node* insertClose(int* closeSet, int len, CloseHashNode* chnode, int index); //insert closed patterns into tree;
};


