题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
1. 如果节点存在右子树:那么它的下一个节点就是右子树中的最左节点;
2. 如果节点没有右子树:
1). 节点为其父节点的左子节点,那么其父节点就是它的下一个节点;
2). 节点为其父节点的右子节点,那么需要沿其父指针一直向上遍历,一直找到某个节是其父节点的左子节点为止,那么这个节点的父节点即是需要寻找的下一个节点。
/*
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;
TreeLinkNode* next = nullptr;
//如果一个节点有右子树,那么它的下一个节点就是右子树的最左子节点
if(pNode->right != nullptr)
{
TreeLinkNode* rightNode = pNode->right;
while(rightNode->left != nullptr)//找到右子树的最左子节点
rightNode = rightNode->left;
next = rightNode;
}
//不含右子树,且是其父节点的右子节点
else if(pNode->next != nullptr)
{
TreeLinkNode* parentNode = pNode->next;
TreeLinkNode* currentNode = pNode;
while(parentNode != nullptr && currentNode == parentNode->right)
{
currentNode = parentNode;
parentNode = parentNode->next;//沿父节点遍历
}//父节点不存在时循环终止
next = parentNode;
}
return next;
}
};