[英]Add node to binary search tree
以下代碼應將節點添加到我的BST結構中,但未這樣做。 新節點根本不會附加到樹,包括根節點。 誰能指出問題出在哪里?
樹的構造函數:
template <typename K, typename T>
MyBinaryTree<K, T>::MyBinaryTree() {
root = nullptr;
}
從外部調用的函數:
template <typename K, typename T>
void MyBinaryTree<K, T>::addValue(K key, T value) {
Node *node = new Node(key, value);
addToSubtree(root, node);
}
和必須附加節點的內部私有函數:
template <typename K, typename T>
void MyBinaryTree<K, T>::addToSubtree(MyBinaryTree<K, T>::Node *node,
MyBinaryTree<K, T>::Node *toAdd) {
if(node == nullptr) {
node = toAdd;
} else {
if(toAdd->key > node->key) addToSubtree(node->right, toAdd);
else if(toAdd->key < node->key) addToSubtree(node->left, toAdd);
}
}
您應該使用如下引用: MyBinaryTree<K, T>::Node *&root
由於您在addToSubtree
修改root時,它僅修改本地函數參數root,root參數的副本,而不修改root參數本身。
您的node
變量是一個包含指向Node
指針的局部變量,當您為它分配一個值時,它僅適用於函數范圍內的該局部變量。
為了使您的函數正常工作,您應該使node
變量的指針指向指針(這樣就可以像addToSubtree(&node->right, toAdd)
或指向指針的引用那樣addToSubtree(&node->right, toAdd)
它addToSubtree(&node->right, toAdd)
。
您的代碼有兩個問題:
root
元素不應作為參數傳遞。 由於它是成員變量,因此它在每個成員函數作用域中都存在automaticallty。 這個 :
template <typename K, typename T>
void MyBinaryTree<K, T>::addToSubtree(MyBinaryTree<K, T>::Node *root,
MyBinaryTree<K, T>::Node *toAdd) {
//rest...
}
應該是這樣的:
template <typename K, typename T>
void MyBinaryTree<K, T>::addToSubtree( MyBinaryTree<K, T>::Node *toAdd) {
if(root == nullptr) {
root = toAdd;
} //rest...
}
該函數已經知道什么是root
,因為root是成員變量。 成員函數可以更改成員變量,而無需將其傳遞給函數
如果參數已經是指針,則為了更改指針本身,應將其作為指針傳遞給指針或作為指針傳遞給參照
因此,假設我們確實希望繼續將root
作為參數傳遞(我們不希望這樣做),我們應該將它作為
void MyBinaryTree<K, T>::addToSubtree(MyBinaryTree<K, T>::Node **root,
MyBinaryTree<K, T>::Node *toAdd) {
if(*root == nullptr) {
*root = toAdd;
//rest
要么作為
void MyBinaryTree<K, T>::addToSubtree(MyBinaryTree<K, T>::Node*& root,
MyBinaryTree<K, T>::Node *toAdd) {
if(root == nullptr) {
root = toAdd;
//the rest...
第二個是更多的C ++樣式,第一個是更多的C樣式,但是兩者都是有效的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.