这个题虽然不是很难,提交了4次才算通过。有点汗颜,如果是面试可能就挂了,思路还是比较清楚的。
我们分情况讨论。
1.给出的节点存在右子节点的情况。比较好处理,也不需要回溯。dfs就可以搞定。就一直找到右边节点的中序遍历的第一个节点就可以了。
2.不满足1,但是它存在父节点。
    分两种情况:
                      a.该父节点的右子树是它,它就变成了它父亲。然后一直寻亲上去。直到找到一个父节点左子树上挂的是该节点,走b。没找到就返回空。
                      b.该父节点的左子树是它,那么根据中序遍历,这个父节点就我们要找到的节点。
3.前面都不满足,没找到下一个节点。
                      
/*
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) {
        TreeLinkNode* res;
        if(res != NULL){
            return NULL;
        }
        
        if(pNode == NULL){
            return NULL;
        }
        
        if(pNode->right != NULL){
           return dfs(pNode->right);
        }
        
        while(pNode->next != NULL && pNode->next->right == pNode){
            pNode = pNode->next;   
        }
        
        if(pNode->next != NULL && pNode->next->left == pNode){
            return pNode->next;
        }
        
        return NULL;
    }
    
    TreeLinkNode* dfs(TreeLinkNode* pNode){
        if(pNode->left != NULL){
            return dfs(pNode->left);
        }
        
        return pNode;
    }
};