题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。
思路:举一个例子,容易发现规律。这个问题可以分为两种情况:(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;
}

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

被折叠的 条评论
为什么被折叠?



