分情况讨论,要画出图来判断
/*
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 == NULL) return NULL;
//因为当前正在被访问一定是根,所以下一个一定是右(也就是右子树的最左子结点)
//如果右为空,分情况讨论1.该结点为父结点的左子结点2.为父结点的右子结点
//如果是左子结点,那么返回它的父结点
//如果是右子结点,沿着父结点向上寻找,直到找到一个结点的父结点左子结点是该结点
if(pNode->right !=NULL){
//找到最左子结点
TreeLinkNode* tmp = pNode->right;
while(tmp->left != NULL) tmp = tmp->left;
return tmp;
}
//如果父结点不为空且自身是左子结点
else if(pNode->next != NULL && pNode->next->left != NULL && pNode->next->left == pNode){
return pNode->next;
}
//如果父结点不为空且自身是右子结点
else if(pNode->next != NULL && pNode->next->right == pNode){
//找到一个结点的父结点的左子结点是该结点,就返回该结点的父结点
//直到找到一个
while(pNode->next != NULL && pNode->next->left != pNode){
pNode = pNode->next;
}
return pNode->next;
}
//节点为根结点
return NULL;
}
};