根据中序遍历的规则,可以知道,当该结点有右子树时,返回其右子树最左边的结点。当该结点没有右子树时,则需要向上寻找第一个其左子树中包含该结点的结点。
根据这两种需求,分别写两个函数,一个通过递归找最左边的子结点,一个通过递归找向上第一个在左子树中包含该结点的点。
根结点由于其next域为空所以需要做特殊处理。
/*
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){
return pNode;
}
if(!pNode->left && !pNode->right && !pNode->next){
return nullptr;
}
if(!pNode->next){
if(!pNode->right){
return nullptr;
}
return findLeft(pNode->right);
}
if(!pNode->right){
if(pNode->next->left == pNode){
return pNode->next;
}
else{
return findNext(pNode);
}
}
else{
return findLeft(pNode->right);
}
}
TreeLinkNode* findLeft(TreeLinkNode* &p){
if(!p->left){
return p;
}
return findLeft(p->left);
}
TreeLinkNode* findNext(TreeLinkNode* p){
if(!p->next){
return nullptr;
}
if(p->next->right == p){
return findNext(p->next);
}
return p->next;
}
};