假设我有一棵树,我想从当前节点继续往左走。如果当前节点没有剩余,我想继续往右走。否则返回。要做类似的事情,我必须写这样的东西:
if (node->left != nullptr)
while (node->left != nullptr)
node = node->left;
else if (node->right != nullptr)
while (node->right != nullptr)
node = node->right;
else return;
如您所见,我必须两次编写条件。我可以这样写吗:
while (node->left != nullptr)
node = node->left;
else while (node->right != nullptr)
node = node->right;
else return;
如果我可以和if一起使用,那也将有所帮助。像这样:
while (...) ...
else if (...) ...
else while (...) ...
else ...
编辑: 刚意识到树的例子不是一个好例子。但是总的来说我可以做这样的事情吗?
答案 0 :(得分:2)
我的意思是,这将满足您的要求
if (node->left != nullptr)
while (node->left != nullptr)
node = node->left;
else if (node->right != nullptr)
while (node->right != nullptr)
node = node->right;
else return;
但是最好检查一下node
是否不是nullptr
(如果您之前没有这么做过)
if (node && node->left != nullptr)
while (node->left != nullptr)
node = node->left;
else if (node && node->right != nullptr)
while (node->right != nullptr)
node = node->right;
else return;
答案 1 :(得分:0)
是的,在这种情况下,这当然是可能的。实际上,您甚至可以避免两次写入if
和while
。
请注意,代码段之间的唯一区别是使用的是 Node
个成员(即,您是向左还是向右分支)。因此,根据要遵循的分支,可以使用指向该成员的指针,如下所示:
Node* Node::* branch = node->left != nullptr ? &Node::left : &Node::right;
然后无条件跟随该分支,如下所示:
while (node->*branch != nullptr)
node = node->*branch;
通常,当您有两个相同的代码段时,您必须根据具体情况决定可以抽象出哪些部分,以及是否对代码进行改进。