Again !
题目描述:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解题思路:分三种情况,
1):该结点有右孩子,则中序遍历下一个结点就是该结点右子树中的最左子结点;
2):该结点无右孩子,且该结点是其父结点的左孩子,则中序遍历的下一个结点就是其父结点;
3):该结点无右孩子,且该结点是其父结点的右子结点,这种情况比较复杂,我们可以沿着指向父结点的指针一直向上遍历,直到找到一个是它父结点的左子结点的结点。如果这 样的结点存在,那么这个结点的父结点就是我们要找的中序遍历下一个结点。
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{ //分三种情况讨论
if(pNode==NULL)
return pNode;
TreeLinkNode* target=NULL;
TreeLinkNode* nextP=NULL;
//有右孩子
if(pNode->right!=NULL)
{
nextP=pNode->right;
while(nextP->left != NULL)
nextP=nextP->left;
target=nextP;
}
else if(pNode->next!=NULL) //没有右孩子; 首先要判断父结点要存在呀!!!!
{
TreeLinkNode* parentNode=pNode->next;
TreeLinkNode* currNode=pNode;
while(parentNode!=NULL && parentNode->left!=currNode)
{
currNode=parentNode;
parentNode=parentNode->next;
}
target=parentNode;
/*
if(pNode->next->left==pNode)//没有右孩子,且是父结点的左孩子结点
target=pNode->next;
else // 没有左孩子,且是父结点的右孩子结点
{
while(pNode->next->next!=NULL && pNode->next!=pNode->next->next->left)
pNode=pNode->next;
if(pNode->next->next==NULL)
target=NULL;
else
target=pNode->next->next;
}*/
}
return target;
}