前言
求LCA的方式有很多。
简单的比如:
- 用求链表公共节点的思想。包括有无指向父节点指针、是否先对齐节点的深度等,能衍生出很多不同处理方式,不再赘述。
- 递归方式。将问题分解成在左右子树上的子问题。
难些的比如:
- Tarjan算法(给树染上黑白灰三色)
- 欧拉序方式
- 树链剖分
本篇博客重点讲述如何用递归方式求LCA,因为在网上收集资料发现很多文章讲述地并不清晰。这种方式在性能上一定不是最好的,但是在代码上是十分简洁的,对于小规模问题能快速解决,是一种解决LCA的小技巧。
code
代码仅仅是如下寥寥数行:
// 此函数的作用是:在以root为根的树中查找key1、key2,返回这两个key的“痕迹”(找到一个key返回key所在节点,找到两个key返回最近公共祖先)
Node * findKey(Node * root, int key1, int key2) {
if (root == NULL) return NULL;
if (root->key == key1 || root->key == key2