【问题标题】:How to find the first ancestor node from two leaf nodes in the same level in a binary tree如何从二叉树中同一级别的两个叶子节点中找到第一个祖先节点
【发布时间】:2018-10-23 22:36:00
【问题描述】:

上面显示了一个 3(2?) 级二叉树。我的问题是如何从二叉树中同一级别的两个叶节点中找到祖先节点?例如,(3, 4)的祖先节点是1。(3, 5)的祖先节点是0。(5, 6)的根节点是2。如果给定两个叶子节点,如何找到它们的第一个共同祖先节点?我正在使用 C++。我的方法和伪代码就像

int mother{} \\ an algorithm to find mother node
int n1(7), n2(11); \\two integer leaf nodes.
int a1(-1), a2(-2);
while(a1 != a2)
{ 
 a1=mother(n1);
 a2=mother(n2);
 n1=a1;
 n2=a2;
}

我认为这太复杂了。我想知道是否存在任何更简单的算法?

【问题讨论】:

  • 将二叉树保存到数组中很简单。查找如何将二叉树存储在数组中。然后打印该数组。您将立即想出解决方案
  • 你只给了子节点吗?或者您是否有权访问根节点?
  • 您通常无法直接访问树中每个节点的父节点,因此您不能只获取parent(node)。您必须从根开始并找到两个节点,然后以某种方式比较您采用的路径。
  • 由于“母亲”在大多数文化中是一个神圣的词,因此当前首选的节点命名法是根、父母、孩子、孩子、兄弟姐妹而不是母亲、父亲、儿子和女儿等。

标签: c++ algorithm


【解决方案1】:

寻找两个叶节点 (LF) 的第一个共同祖先 (FCA) 的算法

  1. 创建一个函数,该函数将返回一个向量,该向量包含到达给定叶节点所需的节点顺序列表,其中 root 是列表中的第一个节点

    vector<Node> GetPathToNode(Node root, Node leafNode);

    如果二叉树组织得当,那么它应该能够直接遍历到叶子节点的最快路径。如果树没有正确组织,那么这将需要一个完整的树遍历算法来找到节点,然后确定到节点的最短路径。

  2. 调用 GetPathToNode(root, leafNodeA);返回向量路径A

  3. 调用 GetPathToNode(root, leafNodeB);返回向量路径B

  4. 创建一个函数,将比较两条路径并找到两个向量中不同的第一个元素。然后,返回第一个不同元素之前的元素。

    Node GetLastEquivalentNode(vector<Node> pathA, vector<Node> pathB);

当然,这可以通过调用第三个函数来代替第三步来进一步优化,该函数镜像 GetPathToNode(),但它需要一个额外的参数:向量 pathA。一旦第三个函数到达第一个非公共祖先,它就会退出并返回其上方的节点。

实际上,第一个共同祖先采用以节点为中心的视图(自下而上)。但是,算法必须从根开始向下移动才能找到最后一个共同祖先。

【讨论】:

    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2010-12-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多