0
我實現BST和我的實現看起來像這樣Bst-爲什麼我的Bst在將節點*鏈接到節點*之後工作?
void insert(node*&r,int key){ // 1) node* r 2) node*&r
if(r==NULL){
r=new node(key);
return;
}
c++;
if(r->key > key){
insert(r->right,key);
}
else if(r->key <key){
insert(r->left,key);
}
}
int main()
{
int n;
cin>>n;
node *root=NULL;
for(int i=0;i<n;i++){
int x;
cin>>x;
insert(root,x);
}
return 0;
}
我之前不清楚爲什麼節點* &沒有節點*。但我有精神堵塞today.I很困惑,如果我們使用節點* &比我們將編輯根永遠是BST的身份,因此,我們將失去BST.On另一方面,我很困惑,爲什麼它不使用節點*。可有人請詳細介紹一下這方面的工作。哪一個,爲什麼?
我有查詢假設最初根是(0x7FFFFFFF的(LET)),並且當我們BST插入值讓8.根將永久改變,因爲線的r =新節點(鍵)線,因爲我們通過引用傳遞根。所以當我們放鬆我們的根時,我們如何能夠插入從第二和第三插入的頂部開始..因爲它被修改。像我們使用臨時指針similary的情況下,鏈接列表插入保留根..我很抱歉,如果我犯傻了。 –
@thoughtfulme否不,你修改'root-> right'(在'insert(r-> right,key);')行,同樣''root-> left',而不是'root'本身。如果最初是'NULL'(第一個'if'測試),那麼你只修改'root',這是正確的,因爲這是你第一次插入樹中。試着在思維上「運行」3-4個值的算法,你會看到發生了什麼。 – vsoftco
如果我錯了,請糾正我的錯誤。因爲我們使用遞歸進行此操作。永久更改將發生在root-> left和root-> right,因爲它們現在是遞歸調用時的根。因此,我們的「實際root」將只有在第一種情況下才會改變,當我們的bst空了,並且只要我們對bst有一些價值,比如2.5 ..我們將在兩邊(取決於按鍵)往下移動,以及我們何時會找到地方正確插入。我們將永久地「改變」該節點的左邊的孩子或右邊的孩子....不是實際的根,因爲它是遞歸的。對於這樣一個長的評論:( –