求二叉树中两个节点的最近公共祖先(三叉链,搜索树,普通二叉树)

本文详细介绍了在三种不同情况下求解二叉树中两个节点的最近公共祖先的方法。针对二叉树每个节点有parent(三叉链)、搜索二叉树以及普通二叉树,分别提供了具体的解决方案和代码实现。
摘要由CSDN通过智能技术生成

求二叉树中两个节点的最近公共祖先。

要求:分别考虑以下三种情况
       1、二叉树每个节点有parent(三叉链)
       2、二叉树是搜索二叉树。
       3、就是普通二叉树。(尽可能实现时间复杂度为O(N))

这里写图片描述

节点:

struct Node
{
    int _data;
    Node* _left;
    Node* _right;
    Node* _parent;

    Node(int x)
        :_data(x)
        , _left(NULL)
        , _right(NULL)
        , _parent(NULL)
    {}
};
一、二叉树每个节点有parent(三叉链)

       这里介绍两种方法并提供代码实现。
第一种方法:
       Node* CommonAncester0(Node* node1, Node* node2)
       把从node1和node2到根节点分别看做两个单链表,定义一个指针tmp游走node2这条链表,node1每走一个节点将node2遍历一遍,同时将tmp->_parent对比,若相等,node1即为公共祖先节点;不相等继续游走。
       代码如下:

Node* CommonAncester0(Node* node1, Node* node2)
{
    if (node1 == NULL || node2 == NULL)
        return NULL;
    Node* tmp = node2;
    while (node1)
    {
        node1 = node1->_parent;
        tmp = node2;
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值