求二叉树任意两个节点的公共祖先

#include <stdio.h>

typedef struct _treeNode {
    struct _treeNode *left, *right;
    int data;
} treeNode;

// 在二叉树中找到两个节点的最近公共祖先
treeNode *findPorQ(treeNode *root, treeNode *p, treeNode *q) {
    if (root == NULL || root == p || root == q) {
        return root;  // 当前节点为空,或者是p或q本身,返回当前节点
    }

    // 在左子树中递归查找p和q的最近公共祖先
    treeNode *left = findPorQ(root->left, p, q);

    // 在右子树中递归查找p和q的最近公共祖先
    treeNode *right = findPorQ(root->right, p, q);

    // 如果左子树中找不到,则返回右子树中找到的结果
    if (left == NULL) {
        return right;
    }

    // 如果右子树中找不到,则返回左子树中找到的结果
    if (right == NULL) {
        return left;
    }

    // 如果左右子树都找到了结果,则当前节点就是最近公共祖先
    return root;
}

这个函数使用递归的方法在二叉树中查找两个给定节点 pq 的最近公共祖先。它的基本思想是:

  • 如果当前节点为空,或者当前节点就是 pq,那么当前节点就是它们的最近公共祖先。
  • 否则,递归地在左子树和右子树中查找 pq 的最近公共祖先。
  • 如果左子树中找不到,则返回右子树中找到的结果。
  • 如果右子树中找不到,则返回左子树中找到的结果。
  • 如果左右子树都找到了结果,则当前节点就是最近公共祖先。

这种递归的思想基于二叉树的性质,能够在树中高效地找到最近公共祖先。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值