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

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

要求:分别考虑以下三种情况
       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;
        
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值