我正在研究一些二叉樹算法,並需要一個「find searchindex ...」查找節點。 treenodes的設計基本上是二叉樹搜索無返回結果(C++)
class TreeNode {
int index; // some identifier
TreeNode *left;
TreeNode *right;
}
並且樹由指向根節點的指針定義。
我對搜索功能的實現是:
void Tree::searchNode(TreeNode * root, int nodeIndex, TreeNode *resultNode){
/* Recursive search */
if (root->index == nodeIndex) {
resultNode = root;
} else {
/* search children if the current node is not a leaf */
if(!root->isLeaf()) {
this->searchNode(root->left,nodeIndex,resultNode);
this->searchNode(root->right,nodeIndex,resultNode);
}
}
}
參數: * 根是樹的根節點,nodeIndex是搜索索引和* resultNode是指向樹中找到(或不)節點的指針。
該函數不返回引用或指針所找到的節點,但修改了指針resultNode使其指向所找到的節點。這個想法是用NULL初始化resultNode,如果匹配發生,執行搜索並修改它。否則它仍然是NULL,我可以輕鬆地檢查是否有搜索結果。
另一類與樹buildingTree作爲成員利用這樣的搜索功能:
TreeNode *resultNodePtr = NULL;
this->buildingTree->searchNode(this->buildingTree->rootPtr,
currentNodeIndex, resultNodePtr);
// do sth. with resultNodePtr if != NULL
我創造* resultNodePtr堆棧,因爲我只需要它暫時裏面的功能上。這是否正確完成?但是:該功能不起作用。 resultNodePtr始終爲NULL,即使樹包含具有search-index的節點。我調試它非常仔細地一步一步,它檢測
(root->index == nodeIndex)
正確,但
resultNode = root;
不起作用(我想resultNode指向同一個地址根點)。 調試器說resultNode在賦值之前是0x0,根節點是一些地址,賦值resultNode仍然是0x0。
是否必須重載運算符=在這種情況下爲類TreeNode?
我已經嘗試過了:
TreeNode & TreeNode::operator=(const TreeNode & oldTreeNode){
*this = oldTreeNode;
return *this;
// ignore childs for now
}
我不是專家,但這個操作符=似乎微不足道。它會影響兩個TreeNode指針* node1 = * node2的分配嗎?
也許你可以幫我。感謝您的閱讀,感謝您的幫助。 如果我自己找到解決方案,我會在這裏發佈。
問候, 馬克
是否有一個原因的指針傳遞和修改呢?使用返回值似乎更簡潔,並且可以避免以下答案中解釋的問題。 – mwd
完全無關您的問題,但通常一個樹排序,該搜索可以更快的方式來實現。是否有理由搜索樹的每個節點?實際上,你的類在std :: list上搜索比std :: find慢! –
另外,該運算符=您實現的是一個無限遞歸循環。它應該像'index = oldTreeNode.index; left =(oldTreeNode.left?new TreeNode(* oldTreeNode.left):nullptr);右=(?oldTreeNode.right新的TreeNode(* oldTreeNode.right):nullptr);' –