【发布时间】:2020-07-10 15:36:58
【问题描述】:
我有以下树形结构:
struct Node {
int data;
Node* parent = nullptr;
}
每个节点最多有一个父节点,但可以有多个子节点。我试图找到两个没有任何孩子的节点(node1 和 node2)的最低共同祖先。
这是我当前的代码:
std::vector<Node*> ancestors1;
std::vector<Node*> ancestors2;
temp_node = node1->parent;
while(temp_node!=nullptr) {
ancestors1.push_back(temp_node);
temp_node = temp_node->parent;
}
temp_node = node2->parent;
while(temp_node!=nullptr) {
ancestors2.push_back(temp_node);
temp_node = temp_node->parent;
}
Node* common_ancestor = nullptr;
if (ancestors1.size() < ancestors2.size()) {
ptrdiff_t t = ancestors1.end() - ancestors1.begin();
std::vector<Node*>::iterator it1 = ancestors1.begin();
std::vector<Node*>::iterator it2 = ancestors2.end() - t;
while(it1!=ancestors1.end()) {
if (*it1 == *it2) {
common_ancestor = *it1;
}
++it1;
}
} else {
ptrdiff_t t = ancestors2.end() - ancestors2.begin();
std::vector<Node*>::iterator it2 = ancestors2.begin();
std::vector<Node*>::iterator it1 = ancestors1.end() - t;
while(it2!=ancestors2.end()) {
if (*it1 == *it2) {
common_ancestor = *it1;
}
++it2;
}
}
return common_ancestor
这段代码并不总是有效,我不知道为什么。
【问题讨论】:
-
请尝试创建“并不总是有效”的最小和最简单的树,并使用调试器逐步检查代码以帮助找出问题所在。
-
创建函数来列出祖先而不是重复逻辑。顺便说一句,你有错字,因为你把
node2的祖先放在ancestors1 -
只有一个迭代器移动,所以你只检查一个祖先。
-
只需在 if-else 块的两侧执行
++it1; ++it2;。 -
it2 = ancestors2.end() - t- 为什么?两条路径都必须从根目录开始。难道你不能从一开始就迭代两条路径并在它们不同时立即突破吗?