2016-03-07 23 views
1

我想避免重蹈我的if-else兩次(一次離開,一旦右,相同),所以我這樣做,這感覺很unidiomatic:與樹的左右孩子在C++中避免重複

MovieNode** child = title < parent->title ? &parent->left : &parent->right; 
if(*child) 
    parent = *child; 
else 
    *child = new MovieNode(ranking, title, releaseYear, quantity); 

這樣做的正確方法是什麼?

[順便說一句,這就是爲什麼我喜歡哈斯克爾XD,我只想做parent = child]

+0

那麼你在想什麼是單向性? –

+0

我認爲在你的代碼中有一個錯誤:'* child'的類型是'MovieNode *',而不是'MovieNode',所以最後一行沒有意義。 –

+0

噢,我應該有新的 –

回答

1

它看起來像你寫你的二叉樹的迭代算法插入。你有什麼簡潔和可以接受的,雖然承認看起來有點不正常。

我通常會寫出這樣的算法的方法是這樣的:

// start from your root node, parent must not be NULL 
MovieNode ** current = &parent; 

// find an appropriate empty leaf 
while (*(current = (title < (*current)->title ? &(*current)->left : &(*current)->right))); 

// assign to the empty leaf 
(*current) = new MovieNode(ranking, title, releaseYear, quantity); 

編輯:小但很重要的更新後,我實際測試,並在實際的程序中證明了這一點做的while()循環。現在過去很好。

+0

(提示:'MoveNode *&') –

+0

@MooingDuck聽起來像是一個好主意,直​​到我嘗試了它。問題是,一旦分配了參考,就不能重新分配。因此,在將當前分配給父項後,後續分配只需更改父項。也許你有其他的代碼,有興趣看看沒有所有的derefs,這個循環如何看起來更清潔。 – qexyn