给出一棵二叉树和一个节点,求中序遍历序列的下一个节点。二叉树结构是给出了左右节点以及父节点的。
首先分析中序遍历,中序遍历即左父右的顺序遍历树。
分析规律:
(1)节点存在右节点 if(p->right)
则不断检查p->right是否还有左节点,若没有左节点了,该节点即为res。
if(pNode->right) // 若存在右节点
{
TreeLinkNode* pRight = pNode->right;
while(pRight->left) { // 有左节点,则继续搜寻;无左节点,则返回该点
pRight = pRight->left;
}
nextNode = pRight;
}
(2)节点不存在右节点,且该节点还存在父节点
如1与2,不断判断节点是否为父节点的左节点,若为左节点则说明该父节点为res
特例3,一直不满足,则节点的父节点终会变为nullptr,结果即返回nullptr
else if(pNode->next) { // 不为根节点且不存在右节点
TreeLinkNode* pCurr = pNode;
TreeLinkNode* pNext = pCurr->next;
while(pNext && pCurr == pNext->right) {
pCurr = pCurr->next;
pNext = pNext->next;
}
nextNode = pNext;
}
(3) 上两者情况都不满足,则说明是个没有右节点的根节点,返回nullptr
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(!pNode)
return nullptr;
TreeLinkNode* nextNode;
if(pNode->right) // 若存在右节点
{
TreeLinkNode* pRight = pNode->right;
while(pRight->left) { // 有左节点,则继续搜寻;无左节点,则返回该点
pRight = pRight->left;
}
nextNode = pRight;
}
else if(pNode->next) { // 不为根节点且不存在右节点
TreeLinkNode* pCurr = pNode;
TreeLinkNode* pNext = pCurr->next;
while(pNext && pCurr == pNext->right) {
pCurr = pCurr->next;
pNext = pNext->next;
}
nextNode = pNext;
}
return nextNode;
}