TreeNode *bTree::TreeExistItem(HTTPCSTR lpTreeItemName) { TreeNode *x; if (root == NULL) { return (NULL); } /* search the tree */ x = root; while (x != NULL) { int ret = _tcscmp(lpTreeItemName,x->GetTreeNodeName()); if (ret == 0) { return (x); } else { if (ret < 0) { x = x->GetTreeNodeLeft(); } else { x = x->GetTreeNodeRight(); } } } return (NULL); }
TreeNode *bTree::GetTreeNodeItemID(int value) { int n = value + 1; /* Cheat to allow the counter to be 0 */ if ((count < n) || (n <= 0)) { return (NULL); } TreeNode *node = root; int total = 0; #define NLEFT node->GetTreeNodeLeft()->GetTreeNodeCount() +1 #define NRIGHT node->GetTreeNodeRight()->GetTreeNodeCount() +1 while ((node != NULL) && (total < n)) { if (node->GetTreeNodeLeft()) { if (NLEFT + total >= n) { node = node->GetTreeNodeLeft(); } else { total += NLEFT; // add nodes from left side total++; // Add current node if (total == n) { return (node); } else { node = node->GetTreeNodeRight(); } } } else if (node->GetTreeNodeRight()) { total++; if (total == n) { return (node); } else { node = node->GetTreeNodeRight(); } } else { total++; if (total == n) { return (node); } else { /* FATAL - ##CRITICAL UNEXPECTED ERROR##: BAD IMPLEMENTATION? */ return (NULL); } } } return (NULL); }
// ----------------------------------------------------------------------------- TreeNode* bTree::TreeInsert(HTTPCSTR str, TreeNode *ParentItem) { if (ParentItem == NULL) { if (root == NULL) { TreeNode *newnode = new TreeNode(str, NULL); newnode->SetTreeNodeParentTree(this); root = newnode; count++; return (root); } else { TreeNode *y = NULL; TreeNode *x = root; while (x != NULL) { if (_tcscmp(x->GetTreeNodeName(), str) == 0) { /* already Exists */ return (x); } y = x; if (_tcscmp(str, x->GetTreeNodeName()) < 0) x = x->GetTreeNodeLeft(); else x = x->GetTreeNodeRight(); } /* str doesn't yet exist in tree - add it in */ TreeNode *newnode = new TreeNode(str, y); newnode->SetTreeNodeParentTree(this); if (_tcscmp(str, y->GetTreeNodeName()) < 0) { y->SetTreeNodeLeft(newnode); } else { y->SetTreeNodeRight(newnode); } this->count++; /* Add an additional element to the tree counter */ return (newnode); } } else { TreeNode*newnode = ParentItem->GetTreeNodeChildTree()->TreeInsert(str, NULL); return (newnode); } }