题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路
1、若该结点有右子树,则右子树的最左结点是要找的下一个结点;
2、若该结点没有右子树,则检查父结点,若为父结点的左子结点,则父结点为要找的下一个结点;若为父结点的右子结点,则指向父结点的指针向上遍历,直到找到一个结点是其父结点的左子结点,则这个父结点是要找的下一个结点。
前序、后序遍历同样可以分析,主要对三种遍历方式要熟悉。
C++代码实现
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode->right != NULL)//所有结点有右子树,则右子树中的最左子结点即为下一个结点
{
pNode = pNode->right;
while(pNode->left != NULL)
pNode = pNode->left;
return pNode;
}
else//若无右子树,则判断是否为父结点的左子树,若是则父结点为下一结点;若为父结点的右子树,则递归判断父结点
{
while(pNode->next != NULL)
{
if(pNode->next->left == pNode)
return pNode->next;
pNode = pNode->next;
}
}
return NULL;
}