#ifndef TNODE_
#define TNODE_
#include "STable.h"
using namespace std;

class tNode
{
	protected:
    tNode * left, * mid, * right;
    //ukazatele na levého (0), prostředního (-) a pravého (1) následníka 
    
	public:
	
	//prida term do stromu
	void add (STable * table);
    
	//vytiskne strom
    void print (ostream& out);
    
    //expanduje listy stromu
    void expand (unsigned int depth);
    
    //zredukuje prebytcne termy stromu
    void reduce (unsigned int depth);
    
    //presune koren na mista listu
    tNode * switchroot ();
    
    //prida dany druh uzlu za listy
    void addnode(unsigned int depth, int type);
    
    //spoji dva stromy do jednoho
    tNode * join (tNode * l, tNode * r);
    
    //tranformuje ternarni strom na puvodni binarni
    Node * transform (Node * ptr, tNode * tptr, unsigned int depth);
    
    //zjisti zda je strom dany parametrem podmnozinou stromu na ktery se fce zavolala
    //pokud je podstrom naprosto identicky s hledanym je vysledek FALSE
    bool contains(tNode * tptr, bool diff, unsigned int depth);
    
    //absorbuje nadbytecne podstromy
    unsigned int absorb(tNode * tptr, unsigned int depth);
    
    void change(unsigned int depth);
    
    //zkopiruje ternarni strom
    tNode * copy(tNode ** tptr);
    
    tNode();
    
    ~tNode();
};

//globalni ukazatel na ternarni strom
extern tNode * tRoot;

#endif /*TNODE_*/
