题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
分析
1、叶检点自己是左孩子:返回父节点
自己是右孩子:
(1)如果父亲是左子树,那么就返回父亲的父亲
(2)如果父亲是右子树,一直向上找到一个身为左字树的节点为止,返回他的父亲
2、not叶节点
右孩子不为空:返回右孩子的最最左的叶节点
右孩子为空:返回父节点
代码实现
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{if(!pNode)
return NULL;
if(!pNode->left&&!pNode->right){//leaf
if(!pNode->next)//空叶节点
return NULL;
if(pNode == pNode->next->left)//是父亲的左节点
return pNode->next;
if(pNode == pNode->next->right)//是父亲的右节点
{
TreeLinkNode*p=pNode ;
while(p){
if(p->next!=NULL){
if(p->next->left==p)
return p->next;
}
p=p->next;
}
return NULL;
}
}
else{
if(pNode->right==NULL){//没有右子树
TreeLinkNode*p=pNode ;//同上
while(p){
if(p->next!=NULL){
if(p->next->left==p)
return p->next;
}
p=p->next;
}
return NULL;
}
else{
TreeLinkNode*p=pNode->right;//
while(p->left){
p=p->left;
}
return p;
}
}
return NULL;
}