2016-04-21 82 views
-2
void insert(int key) 
{ 
    insertRec(key, root); 
} 

void insertRec(int key, Node *current) 
{ 
    if(current==NULL) 
     current = new Node(key); 
    else if(key <= current->value) 
     insertRec(key, current->leftChild); 
    else 
     insertRec(key, current->rightChild); 
} 

这是怎么回事?二叉树递归插入法不起作用

在插入函数中,树的键值和根被传递给insertRec。如果节点为空,则创建一个新节点并将其设置为键值。否则,递归地向左或向右移动,直到节点遇到空点并在那里插入新节点。

+1

[找到一个很好的入门书(http://stackoverflow.com/questions/ 388242/the-definitive-c-book-guide-and-list)并阅读关于传递参数*的引用*。 –

+3

分配一个局部变量'current'与插入节点不一样。它只是修改局部变量,而不是*变量所指的*,这就是你想要的。为了将来的参考,尽量避免只是说“东西不行”。描述*你的代码如何工作。 – Zong

+0

'void insertRec(int key,Node *&current)'应该做的伎俩。 –

回答

2

这不是真的代码'不起作用'。当然,正如它所写的那样,它是有效的。问题是你写了一些与你所需要的不同的东西。

当您将参数传递给insertRec()时,例程会获得指向Node对象的指针的副本。所以,当你在

current = new Node(key); 

分配一个值,你在局部变量current重写本地副本。调用函数(及其数据)不知道它。

如果你想在主叫方收到新的值,声明一个函数需要a reference变量:

void insertRec(int key, Node *&current) 
+0

谢谢。按照我的意愿添加&制作代码。但是我对*和&感到困惑。我以为他们都指向相同的地址,在这种情况下,它是根节点的地址,我可以通过指针电流修改值。 – Raymond

+0

这是没有办法的奇怪,只是一个指针的引用。这种引用只是一个掩码下的指针。你可以通过声明'void insertRec(int key,Node ** current)'并使用'insertRec(key,&(current-> leftChild))'来指明指针的显式指针;'(不需要内部圆括号,只是为了便于阅读)。然后主分配应该看起来像'* current = new Node(key);'带有明确的解引用。 – CiaPan