题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
BinaryTreeNode* GetNext(BinaryTreeNode* pNode)
{
if(pNode==nullptr) return nullptr;
BinaryTreeNode* pNext=nullptr;
if(pNode->m_pRight!=nullptr)//如果有右儿子
{
pNode=pNode->m_pRight;
while(pNode->m_pLeft!=nullptr)//那么下一个节点就是右子树最左下的节点
{
pNode=pNode->m_pLeft;
}
pNext=pNode;
}
else if(pNode->m_pParent!=nullptr)//如果有父节点
{
if(pNode->m_pParent->m_pLeft==pNode)//(如果有父节点且)该节点是父节点的左儿子
{
pNext=pNode->m_pParent;//那么下一个节点就是该节点的父节点
}
else//(如果有父节点且)该节点是父节点的右儿子
{
while(pNode->m_pParent!=nullptr)//那么下一个节点:沿着该节点的父节开始点找一个节点X,X是其父节点的左儿子。
{ //则下一个节点是X的父节点 ,若没找到这样的X,表示下一个节点为空
pNode=pNode->m_pParent;
BinaryTreeNode* parent;
if(pNode->m_pParent!=nullptr) parent=pNode->m_pParent;
if(pNode==parent->m_pLeft)
{
pNext=parent;
break;
}
}
}
}
//else 没有父节点,且没有右儿子。下一个节点为空,pNext初始为空,最后的else分支不用再有操作
return pNext;
}
书中代码:
BinaryTreeNode* GetNext(BinaryTreeNode* pNode)
{
if(pNode == nullptr)
return nullptr;
BinaryTreeNode* pNext = nullptr;
if(pNode->m_pRight != nullptr)
{
BinaryTreeNode* pRight = pNode->m_pRight;
while(pRight->m_pLeft != nullptr)
pRight = pRight->m_pLeft;
pNext = pRight;
}
else if(pNode->m_pParent != nullptr)
{
BinaryTreeNode* pCurrent = pNode;
BinaryTreeNode* pParent = pNode->m_pParent;
while(pParent != nullptr && pCurrent == pParent->m_pRight)
{
pCurrent = pParent;
pParent = pParent->m_pParent;
}
pNext = pParent;
}
return pNext;
}