1.题目
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
2.思路
返回当前节点node在中序遍历的下一个节点,分为三种情况:
- 如果node的右子树存在,那么node的下一个节点就是右子树的最左子节点;
- 如果node的右子树不存在,且这个节点是其父节点的左子节点,那么这个节点的下一个节点就是它的父节点;
- 如果node的右子树不存在,且这个节点是其父节点的右子节点,这个节点的下一节点是将当前节点纳入其左子树的最低节点。
注:最后一种情况存在特例,下一个节点可能为NULL,这意味着此前沿着右侧通路向上的回溯,抵达了根节点。也就是说,它是全树右侧通路的终点———也是中序遍历的终点,没有后继。(如下图中的M)
第一种情况举例:B的下一个节点是I A的下一个节点是F
第二种情况举例:I的下一个节点是E
第三种情况举例:H的下一个节点是B
3.实现
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next; //指向父节点的指针
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
*/
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode == nullptr)
return nullptr;
//情况1
if(pNode->right != nullptr)
{
pNode = pNode->right;
while(pNode->left != nullptr)
pNode = pNode->left;
return pNode;
}
while(pNode->next != nullptr)
{
if(pNode == pNode->next->left)
return pNode->next;
pNode = pNode->next;
}
return nullptr;
}
};