给定一棵树,同时给出树中的两个结点(n1和n2),求它们的最低公共祖先。也就是常见的LCA(Lowest Common Ancestor )问题。
看下面的图就明白了:
方法一
下面是一个简单的复杂度为 O(n) 的算法,解决LCA问题
1)找到从根到n1的路径,并存储在一个向量或数组中。
2)找到从根到n2的路径,并存储在一个向量或数组中。
3) 遍历这两条路径,直到遇到一个不同的节点,则前面的那个即为最低公共祖先.
下面的C++的程序实现
01
// O(n) 解决 LCA
02
#include
03
#include
04
using namespace std;
05
06
//二叉树节点
07
struct Node
08
{
09
int key;
10
struct Node *left, *right;
11
};
12
//公用函数,生成一个节点
13
Node * newNode(int k)
14
{
15
Node *temp =new Node;
16
temp->key = k;
17