递归方式求LCA(最近公共祖先)

本文介绍了如何使用递归方式寻找二叉树中两个节点的最近公共祖先(LCA)。通过定义递归函数findKey,在先序遍历的基础上,分析根节点与查找目标的关系,确定LCA。当两个目标节点都在子树中时,根节点即为LCA;若仅在某一子树中找到目标节点,则返回该子树的查找结果。递归终止条件和处理各种情况的逻辑清晰阐述了递归求解LCA的方法。
摘要由CSDN通过智能技术生成

递归方式求LCA(最近公共祖先)

前言

求LCA的方式有很多。
简单的比如:

  1. 用求链表公共节点的思想。包括有无指向父节点指针、是否先对齐节点的深度等,能衍生出很多不同处理方式,不再赘述。
  2. 递归方式。将问题分解成在左右子树上的子问题。

难些的比如:

  1. Tarjan算法(给树染上黑白灰三色)
  2. 欧拉序方式
  3. 树链剖分

本篇博客重点讲述如何用递归方式求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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值