题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
既然有父节点,那么久可以不用遍历全部树来获得结果
可以分情况讨论
首先中序遍历是,先左子树在根节点在右子树
1、某一个节点的中序遍历节点将是右子树下的左子树下左子树为空的节点(如果左子树节点存在)
2、某一个节点的右子树不存在时有两种情况,
(1)该节点为与某个父节点的左子树下(那么该父节点就是中序遍历后一个节点)
(2)该节点直到根节点都在右子树下,那么该节点时最好一个节点中序遍历后一个节点为null
实现如下:
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if (pNode->right != nullptr)
{
return pNode->right;
}
while (pNode->next)
{
if (pNode->next->left == pNode) // 是左子树节点
{
return pNode->next;
}
else
{
pNode = pNode->next;
}
}
return nullptr;
}
}