剑指offer-面试题58:二叉树的下一个结点

本文详细阐述了如何通过给定的二叉树和结点,找到其中序遍历顺序的下一个结点。文章分为四种情况讨论解决策略,包括结点存在右子结点、结点本身作为左子结点、结点本身作为右子结点,以及合并后的简化算法。

题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。

思路:举一个例子,容易发现规律。这个问题可以分为两种情况:(1)结点存在右子结点,那么中序遍历的下一个结点就是它的右子结点的最左边的子结点。(2)结点不存在右子结点,这里又要考虑两种情况:一是结点本身作为左子结点,那么它的下一个结点就是它的父结点;二是结点本身作为它的父结点的右子结点,那么它的下一个结点为它的第一个作为左子结点的祖宗的父结点。

    对于不存在右子结点的两种可以分开考虑,《剑指offer》里把这两种情况合并,代码要简洁的多。合并以后这样考虑:如果当前结点不是它的父结点的左子结点,那么把当前结点替换成它的父结点,直到当前结点为一个左子结点。下一个结点就是这个左子结点的父结点。

BinaryTreeNode* NextNode(BinaryTreeNode* pNode)
{
    if(pNode == NULL)
        return NULL;
    
    BinaryTreeNode* NextNode = NULL;   
    if(pNode->m_pRight != NULL)
    {
        NextNode = pNode->m_pRight;
        while(NextNode->m_pLeft != NULL)
            NextNode = NextNode->m_pLeft;
    }
    else if(pNode->m_pParent != NULL)
    {
        BinaryTreeNode* pCurrent = pNode;
        BinaryTreeNode* pParent = pNode->m_pParent;
        while(pParent != NULL && pCurrent == pParent->m_pRight)
        {
            pCurrent = pParent;
            pParent = pParent->m_pParent;
        }
        
        NextNode = pParent;
    }
    
    return NextNode;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值