给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode==nullptr) return nullptr; //情况1.空树,返回空
if(pNode->right!=nullptr) //情况2.有右子树,则本节点的下一个节点即是其右子树的最左的子节点
{
TreeLinkNode*p=pNode->right;
while(p->left!=nullptr) {p=p->left;}
return p;
}
while(pNode->next!=nullptr) //情况3.1没有右子树,则本节点的下一个节点即是 满足:本节点的父节点(1)是他父节点(2)的左子节点 这一条件时,返回(2)
{
if(pNode->next->left==pNode) return pNode->next;
pNode=pNode->next;
}
return nullptr; //情况3.2 已经找到根节点了,结束上面的循环,那么本节点的下一个节点就指向nullptr
}
};