给定一个二叉树和其中一个节点,请找出中序遍历的下一个节点,并且返回
此处分为两种情况:
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *father;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), father(NULL) {
}
};
*/
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode==NULL)
return NULL;
TreeLinkNode* rNode=NULL;
TreeLinkNode* nextNode=NULL;
//情况1、
//右子树存在
if(pNode->right)
{
rNode=pNode->right;
//找到最左边的节点
while(rNode->left)
rNode=rNode->left;
nextNode=rNode;
}
else if(pNode->next)
{
//parent标记pNode的父亲节点
TreeLinkNode* parent=pNode->father;
TreeLinkNode* pCur=pNode;
nextNode=pNode;
//如果pNode是他父亲节点的右子树,一直往上找,
while(parent && pCur==parent->right)
{
pCur=parent;
parent=pCur->father;
}
//此时pCur有两种可能
//1、是其父亲节点的左孩子
//2、是根节点,说明是中序遍历的最后一个节点,它的父亲节点为空
nextNode=parent;
}
return nextNode;
}
};