给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
/*
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.当前节点如果是在左子树上则有:
// 1.如果有右边子树,则下一个节点为右子树的最左节点
// 2.否则,向上找使得当前分支为其左子树的父亲节点
// 2. 如果为只有右子树的节点,则返回为空,说明为最后一个节点
class Solution {
public:
TreeLinkNode* getRightLeft(TreeLinkNode* pNode) {
if (pNode->left == NULL) return pNode;
else return getRightLeft(pNode->left);
}
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode == NULL) return NULL;
TreeLinkNode* t = NULL;
if(pNode->right !=NULL) {
return getRightLeft(pNode->right);
}
while(pNode->next != NULL) {
TreeLinkNode *q = pNode->next;
if(q->left == pNode) {
t = q;
break;
}
pNode = q;
}
return t;
}
};