【问题标题】:Avoiding repetition with left-right children of tree in C++在 C++ 中避免与树的左右子节点重复
【发布时间】:2016-06-21 17:38:06
【问题描述】:

我想避免重复我的 if-else 两次(一次左,一次右,完全相同),所以我这样做了,感觉很不习惯:

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

这样做的正确方法是什么?

[顺便说一句,这就是我更喜欢 Haskell XD 的原因,我只会做 parent = child]

【问题讨论】:

  • 那么你认为什么是单调的?
  • 我认为您的示例代码中存在错误:*child 的类型为 MovieNode*,而不是 MovieNode,因此最后一行没有意义。
  • 哦,我应该有新的
  • 为什么要使用双指针?
  • 不相关,有一次我写了一个二叉树,也因为同样的原因而受挫,就切换到了Node* children[2];,很神奇。 Node* child = parent-&gt;children[title &gt; parent-&gt;title]; 没有分支。

标签: c++ pointers binary-tree idioms


【解决方案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() 循环进行了次要但重要的更新。现在可以走了。

【讨论】:

  • (提示:MoveNode*&amp;
  • @MooingDuck 在我尝试之前听起来是个好主意。问题是,一旦分配了引用,您就无法重新分配。因此,在将当前分配给父级之后,后续分配只会更改父级。也许你脑子里有其他代码,想看看这个循环在没有所有 derefs 的情况下如何看起来更简洁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多