描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。
注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
时间:2019-07-28 16:07
函数名:getNext
分析
首先这道题给出的是中序遍历这个二叉树,那么就是左根右。我们在求一个结点的下一个结点,那么这个时候我们需要分情况讨论:
1、如果该结点有右子树,则该结点的下一个结点为该结点的右子树的最左结点。
2、如果该结点没有右子树,则又分两种情况讨论:
情况一:如果该结点为该结点的父结点的左孩子,则该结点的父结点pNode.next则为下一个结点。
情况二:如果该结点为该结点的父结点的右孩子,则该结点的父结点的父结点的父结点,直到其中的一个父结点是这个父结点的左孩子,则该父结点的父结点为下一个结点。
代码实现
/*
描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。
注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
时间:2019-07-28 16:07
函数名:getNext
*/
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
BinaryTreeNode* m_pParent;
};
BinaryTreeNode* getNext(BinaryTreeNode* pNode)
{
if (NULL == pNode)
{
return NULL;
}
BinaryTreeNode* pNext = NULL;
if (pNode->m_pRight != NULL) //第1点
{
BinaryTreeNode* pRight = pNext->m_pRight;
while (pRight->m_pLeft != NULL)
{
pRight = pRight->m_pLeft;
}
pNext = pRight;
}
else if (pNode->m_pParent != NULL) //第2点
{
BinaryTreeNode* tmp = pNode;
BinaryTreeNode* pParent = pNode->m_pParent;
while(pParent!=NULL && tmp==pParent->m_pRight)
{
tmp = pParent;
pParent = pParent->m_pParent;
}
pNext = pParent;
}
return pNext;
}