繁体   English   中英

如何从二叉树中同一级别的两个叶节点中找到第一个祖先节点

[英]How to find the first ancestor node from two leaf nodes in the same level in a binary tree

在此处输入图片说明

上面显示了一个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;
}

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

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

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

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

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

  2. 调用GetPathToNode(root,leafNodeA); 返回向量pathA

  3. 调用GetPathToNode(root,leafNodeB); 返回向量pathB

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

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

当然,可以通过用对第三个函数的调用代替第三步来进一步优化,该函数镜像了GetPathToNode(),但是它带有一个附加参数:向量pathA。 一旦到达第一个非公共祖先,该第三个函数将退出,并返回位于其上方的节点。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM