我有以下树结构:
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
这段代码并不总是起作用,我不知道为什么。
对不起,我无法抗拒。
除了错别字和错误,我相信它看起来更简单:
#include <cassert>
#include <algorithm>
#include <iostream>
#include <vector>
struct Node {
int data;
Node *parent = nullptr;
};
Node* findCommonAncestor(Node *pNode1, Node *pNode2)
{
// find paths of pNode1 and pNode2
std::vector<Node*> path1, path2;
for (; pNode1; pNode1 = pNode1->parent) path1.push_back(pNode1);
for (; pNode2; pNode2 = pNode2->parent) path2.push_back(pNode2);
// revert paths to make indexing simple
std::reverse(path1.begin(), path1.end());
std::reverse(path2.begin(), path2.end());
// compare paths
Node *pNode = nullptr; // ancestor
size_t n = std::min(path1.size(), path2.size());
for (size_t i = 0; i < n; ++i) {
if (path1[i] == path2[i]) pNode = path1[i];
else break;
}
// done
return pNode;
}
int main()
{
// sample tree:
/* 1
* |
* 2
* / \
* 3 4
* |
* 5
*/
Node node1 = { 1, nullptr };
Node node2 = { 2, &node1 };
Node node3 = { 3, &node2 };
Node node4 = { 4, &node2 };
Node node5 = { 5, &node4 };
Node *pNode = findCommonAncestor(&node3, &node5);
if (pNode) {
std::cout << "Lowest common ancestor: " << pNode->data << '\n';
} else {
std::cout << "No common ancestor found!\n";
}
}
产出:
Lowest common ancestor: 2
问题内容: 这是一个受欢迎的面试问题,我唯一可以找到的有关该主题的文章是TopCoder的文章。对我来说不幸的是,从访谈答案的角度来看,它看起来过于复杂。 除了绘制到两个节点的路径并推导祖先之外,没有其他更简单的方法了吗?(这是一个很流行的答案,但是面试题有一个变体,要求一个固定的空格答案)。 问题答案: 恒定空间答案:(尽管不一定有效)。 有一个函数findItemInPath(int inde
我的问题是树中有大量的节点和许多查询。是否有一种算法,它进行预处理,使查询能够在恒定的时间内得到答复。 我研究了使用RMQ的LCA,但我不能使用该技术,因为我不能对树中的这么多节点使用数组。 如果知道它是满二叉树,节点之间的关系如上所示,那么有人能给我一个高效的实现来快速回答许多查询。 但是当有很多查询时,这种算法非常耗时,因为在最坏的情况下,我可能必须遍历30的高度(树的最大高度)才能到达根(最
68.1 二叉查找树 题目链接 Leetcode : 235. Lowest Common Ancestor of a Binary Search Tree 解题思路 在二叉查找树中,两个节点 p, q 的公共祖先 root 满足 root.val >= p.val && root.val <= q.val。 // java public TreeNode lowestCommonAncestor
如果我拆分while循环,有什么不同吗?谢了!
我试图通过自顶向下递归实现二叉树最低公共祖先(LCA)问题的解决方案。 我使用的方法是: 想法:找到在任一子树中有一个所需节点的节点,而另一个所需节点是相反的子树。 以下是确切的实现: 例如: 这将返回树的根作为结果。结果=TreeNode(2)
我的问题是:“这是已知算法的已知问题吗?”。我怀疑是。它似乎非常类似于拓扑排序。我有一个基于合并排序的算法的想法,但如果已知的算法已经存在,就没有理由提出我自己的算法。