C/C++面试:46---寻找二叉树中两个节点的最近公共祖先节点

一、如果是二叉搜索树

  • 二叉搜索树的特征是:对于一个给定的节点,其右子节点的值都大于自己,其做子节点的值都小于自己
  • 寻找二叉搜索树两个节点的最近公共祖先节点的规则是:遍历二叉搜索树,如果遍历到哪个节点的值位于这两个节点的值之间,那么此节点就是这两个节点的最近公共祖先节点

图示说明

  • 比如说我们要寻找0和2这两个节点的最近公共祖先节点
  • 规则为:
    • 第一步:先遍历根节点,发现根节点的值比这两个节点的值都大,那么就向左遍历
    • 第二步:遍历到3,继续判断,发现3还是比0和2大,那么继续向左遍历
    • 第三步:此时遍历到1,发现1位于0和2之间,那么遍历结束,可以确定1就是0和2这两个节点的最近公共祖先节点

C/C++面试:46---寻找二叉树中两个节点的最近公共祖先节点_第1张图片

二、如果是带有父节点指针的普通二叉树

  • 现在我们假设这棵树是一棵普通的二叉树,并且每个节点还有指向于父节点的指针
  • 规则为:依次遍历两个节点的所有父节点,当第一次出现它们的哪个父节点相同时,那么这个节点就是这两个节点的最近公共祖先节点

图示说明

  • 假设我们此处要寻找F和H的最近公共祖先节点
  • 寻找的规则为:
    • 第一步:先用一个指针指向于F的父节点D,然后遍历H的所有父节点E、B、A,发现D不在E、B、A之中,那么第一次循环结束
    • 第二步:开始第二次循环,此时将指针指向于D的父节点B,然后再次从H的第一个父节点开始遍历,依次遍历E、B、A,此时发现B在E、B、A之中,那么就可以确定B就是F和H的最近公共祖先节点

C/C++面试:46---寻找二叉树中两个节点的最近公共祖先节点_第2张图片

编码实现

typedef struct node
{
    BinaryNode* _left;
    BinaryNode* _right;
    BinaryNode* _parent;
    int _value;
    BinaryNode(const int& value):_value(value), _left(NULL), _right(NULL), _parent(NULL){}
} Node;

Node *getLastCommonAncestor(Node *node1, Node* node2)
{
    Node *temp1 = node1;
    Node *temp2 = node2;

    wile(temp1 != nullptr)
    {
        // 指向于node1新的父节点
        temp1 = temp1->_parent;
        
        // 还是从node2的第一个父节点开始遍历
        temp2 = node2->_parent;
        while(temp2 != nullptr)
        {
            // 如果发现node2的其中一个父节点与temp1相等, 返回
            if(temp1 = temp2)
                return temp1;
            // 否则继续遍历node2的父节点
            else
                temp2 = temp->_parent;
        }
    }
}

你可能感兴趣的:(C/C++面试)