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

来源:互联网 发布:软件开发工艺流程 编辑:程序博客网 时间:2024/05/22 14:33

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

思路:举一个例子,容易发现规律。这个问题可以分为两种情况:(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;}



0 0
原创粉丝点击