--- /dev/null
+class DistFunc;\r
+\r
+class ClusterNode\r
+ {\r
+ friend class ClusterTree;\r
+public:\r
+ ClusterNode()\r
+ {\r
+ m_dWeight = 0.0;\r
+ m_dWeight2 = 0.0;\r
+ m_ptrLeft = 0;\r
+ m_ptrRight = 0;\r
+ m_ptrParent = 0;\r
+ m_uIndex = 0;\r
+ m_ptrPrevDisjoint = 0;\r
+ m_ptrNextDisjoint = 0;\r
+ }\r
+ ~ClusterNode() {}\r
+\r
+public:\r
+ unsigned GetIndex() const { return m_uIndex; }\r
+ ClusterNode *GetLeft() const { return m_ptrLeft; }\r
+ ClusterNode *GetRight() const { return m_ptrRight; }\r
+ ClusterNode *GetParent() const { return m_ptrParent; }\r
+ double GetWeight() const { return m_dWeight; }\r
+\r
+ const ClusterNode *GetClusterLeaf(unsigned uLeafIndex) const;\r
+ unsigned GetClusterSize() const;\r
+ double GetClusterWeight() const;\r
+ double GetLeftBranchWeight() const;\r
+ double GetRightBranchWeight() const;\r
+ double GetLeftWeight() const;\r
+ double GetRightWeight() const;\r
+\r
+ void LogMe() const;\r
+\r
+ double GetWeight2() const { return m_dWeight2; }\r
+ void SetWeight2(double dWeight2) { m_dWeight2 = dWeight2; }\r
+\r
+protected:\r
+ void SetIndex(unsigned uIndex) { m_uIndex = uIndex; }\r
+ void SetWeight(double dWeight) { m_dWeight = dWeight; }\r
+ void SetLeft(ClusterNode *ptrLeft) { m_ptrLeft = ptrLeft; }\r
+ void SetRight(ClusterNode *ptrRight) { m_ptrRight = ptrRight; }\r
+ void SetParent(ClusterNode *ptrParent) { m_ptrParent = ptrParent; }\r
+ void SetNextDisjoint(ClusterNode *ptrNode) { m_ptrNextDisjoint = ptrNode; }\r
+ void SetPrevDisjoint(ClusterNode *ptrNode) { m_ptrPrevDisjoint = ptrNode; }\r
+\r
+ ClusterNode *GetNextDisjoint() { return m_ptrNextDisjoint; }\r
+ ClusterNode *GetPrevDisjoint() { return m_ptrPrevDisjoint; }\r
+\r
+private:\r
+ double m_dWeight;\r
+ double m_dWeight2;\r
+ unsigned m_uIndex;\r
+ ClusterNode *m_ptrLeft;\r
+ ClusterNode *m_ptrRight;\r
+ ClusterNode *m_ptrParent;\r
+ ClusterNode *m_ptrNextDisjoint;\r
+ ClusterNode *m_ptrPrevDisjoint;\r
+ };\r
+\r
+class ClusterTree\r
+ {\r
+public:\r
+ ClusterTree();\r
+ virtual ~ClusterTree();\r
+\r
+ void Create(const DistFunc &DF);\r
+\r
+ ClusterNode *GetRoot() const;\r
+ void LogMe() const;\r
+\r
+protected:\r
+ void Join(ClusterNode *ptrNode1, ClusterNode *ptrNode2,\r
+ ClusterNode *ptrJoin);\r
+ void AddToDisjoints(ClusterNode *ptrNode);\r
+ void DeleteFromDisjoints(ClusterNode *ptrNode);\r
+ void Validate(unsigned uNodeCount);\r
+\r
+private:\r
+ ClusterNode *m_ptrDisjoints;\r
+ ClusterNode *m_Nodes;\r
+ unsigned m_uNodeCount;\r
+ unsigned m_uLeafCount;\r
+ };\r