查找两个节点最近的公共祖先

本文介绍了一种在普通二叉树中查找两个节点最近公共祖先的方法,通过追踪两个节点到根节点的路径并进行比较,最终确定最近的公共祖先。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查找一个普通二叉树中两个节点最近的公共祖先。
方法:
1.分别找出两个节点距离根节点的路径并保存在栈中;
2.判断两个栈的长度是否相等,如果不相等,就pop()掉size()值较大的一个直到两个栈的长度相等。
3.分别取两个栈顶的元素,比较值是否相等,若不相等将两个栈顶元素都出栈 ,若相等,则返回栈顶元素。

using namespace std;
template <class T>
struct BinaryTreeNode//定义二叉树的节点
{
    BinaryTreeNode(const T& value)
        :_value(value)
        ,_pLeft(NULL)
        ,_pRight(NULL)
    {}
    T _value;
    BinaryTreeNode<T>* _pLeft;
    BinaryTreeNode<T>* _pRight;
};
template<class T>
class BinaryTree//定义二叉树
{
    typedef BinaryTreeNode<T> Node;
public:
    BinaryTree()
        :_pRoot(NULL)
    {}
private:
    Node* _pRoot;//根节点
};

查找二叉树最近的公共祖先:

Node* FindCommonAncestorNode(Node* first, Node* second)
    {
        if(!_pRoot || !first || !second)
            return NULL;
        return _FindCommonAncestorNode(_pRoot, first, second);
    }
    void Stack(stack<Node*>& s, Node* _pRoot, Node* first)//求两个节点距离根节点的路径
    {
        Node* pCur = _pRoot;
        Node* pPre = NULL;
        while(pCur || !s.empty())
        {
            while(pCur)
            {
                s.push(pCur);
                pCur = pCur->_pLeft;
            }
            Node* pTop = s.top();
            if(pTop->_pRight == NULL || pTop->_pRight == pPre)
            {
                if(pTop->_value == first->_value)
                    break;
                s.pop();
                pPre = pTop;
            }
            else
                pCur = pTop->_pRight;
        }
    }
    Node* _FindCommonAncestorNode(Node* _pRoot, Node* first, Node* second)
    {
        stack<Node*> s1;
        stack<Node*> s2;
        Stack(s1, _pRoot, first);
        Stack(s2, _pRoot, second);
        while(s1.size() > s2.size())
        {
            s1.pop();
        }
        while(s1.size() < s2.size())
        {
            s2.pop();
        }
        while(s1.top() != s2.top())
        {
            s1.pop();
            s2.pop();
        }
        return s1.top();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值