//题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。
//注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
//思路:分为三种情况:
//1.处理没有父亲节点,即根节点情况,找右子树的最左孩子
//2.自己是父亲的左子树输出父亲
//3.自己是父亲的右子树分为两种情况
// 3-1:自己有右孩子,输出右孩子
// 3-2:在自己的父亲及上面找到一个节点是它父亲的左孩子,如果一直找不到说明他是最后的一个节点
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode==NULL)
return NULL;
TreeLinkNode* pre = pNode->next;
TreeLinkNode* tmp;
if(pre == NULL){ //处理没有父亲节点,即根节点情况
tmp = pNode->right;
if(tmp == NULL)
return tmp;
while(tmp->left!=NULL)
tmp = tmp->left;
return tmp;
}
if(pNode==pre->left){ //自己是父亲的左子树输出父亲
if(pNode->right==NULL)
return pre;
return pNode->right;
}
else{ //自己是父亲的右子树
if(pNode->right!=NULL)
return pNode->right; //自己有右孩子,输出右孩子
while(pre->next!=NULL){ //没有右孩子,找祖父节点,如果父亲是祖父节点左孩子输出祖父节点,一直往上
tmp = pre->next;
if(tmp->left == pre) //在自己的上面找到一个节点是它父亲的左孩子
return tmp;
pre = tmp; //如果没有则说明他是最后一个节点,即后序的节点为NULL
}
}
return NULL;
}
剑指offer:找到二叉树中序遍历的下一个节点
最新推荐文章于 2025-02-25 20:47:36 发布