题目:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
分析:
例:
1.如果这个结点有右子树,那下一个结点就是右子树的最左结点,例如结点e。
2.如果这个结点没有右子树,但他是父结点的左孩子,那么它的下一个结点就是父结点,例如结点d。
3.如果这个结点没有右子树,并且他是父结点的右孩子,那么就要一直上溯找祖先结点中是它的父结点的左孩子的结点,这个结点就是下一个结点,例如结点j。
4.如果在情况3中找不到这样的一个结点,那就说明没有下一个结点,例如结点g。
class Solution
{
public:
TreeLinkNode* GetNext( TreeLinkNode* pNode )
{
if ( pNode == NULL )
return NULL;
TreeLinkNode* pNext = NULL;
if ( pNode->right != NULL )
{
TreeLinkNode* pRight = pNode->right;
while ( pRight->left != NULL )
pRight = pRight->left;
pNext = pRight;
}
else if ( pNode->next != NULL )
{
TreeLinkNode* pCurrent = pNode;
TreeLinkNode* pParent = pNode->next;
while ( pParent != NULL && pCurrent == pParent->right )
{
pCurrent = pParent;
pParent = pParent->next;
}
pNext = pParent;
}
return pNext;
}
};