题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解析:三种情况:1.若节点有右子树,中序下一个就是 右子树最左孩子节点 2.若无右子树,且当前节点是父节点的左子节点,下一个就是父节点 3.无右子树,且当前节点是父节点的右子节点,那下一个就是 父节点的父节点,一直往上找, 一直找到根,说明当时节点是树的最右节点,中序 遍历无下一个节点。写法上第2中和第3中可以合并一起写
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode == nullptr) return nullptr;
TreeLinkNode *ret=nullptr;
if(pNode->right!=nullptr)
{
TreeLinkNode *pcur = pNode->right;
while(pcur && pcur->left)
{
pcur=pcur->left;
} ret = pcur;
}else if(pNode->next) //右子树为空 且父节点不空
{
TreeLinkNode *pcur=pNode,*parent=pNode->next;
while(parent && parent->right == pcur) //父节点不空
{
pcur = parent;
parent = parent->next;
}
ret = parent;
}return ret;
}
};
https://www.nowcoder.com/profile/9695725/codeBookDetail?submissionId=37384915