• 分类讨论解法

1)pNode有无右子树,有→2),无→3);

2)有右子树,找到右子树的最左节点返回即可;

3)无右子树,则中序输出的下一节点必然在pNode的上层。看→4);

4)上层为左节点,返回即可;上层为右节点,找上层的上层,重复4)。

/**
 * struct TreeLinkNode {
 *	int val;
 *	struct TreeLinkNode *left;
 *	struct TreeLinkNode *right;
 *	struct TreeLinkNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pNode TreeNode类 
 * @return TreeNode类
 */
struct TreeLinkNode* GetNext(struct TreeLinkNode* pNode ) {
    // write code here
    struct TreeLinkNode* tmp;
    if(!pNode)return pNode;
    if(pNode->right == NULL){ // 如果pNode没有右子树
        // 判断pNode是pNode父节点的左孩子还是右孩子
        while(pNode->next){
            tmp = pNode->next;
            if(pNode == tmp->left) return pNode->next;
            pNode = pNode->next;
        }
        return NULL;
    }else{
        // 如果pNode有右子树
        tmp = pNode->right;
        while(tmp->left){
            tmp = tmp->left;
        }        
    }
    return tmp;
}
  • 遍历暴力解法
/**
 * struct TreeLinkNode {
 *	int val;
 *	struct TreeLinkNode *left;
 *	struct TreeLinkNode *right;
 *	struct TreeLinkNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pNode TreeNode类 
 * @return TreeNode类
 */
struct Node{
    struct TreeLinkNode* tree;
    struct Node* next;
};

struct sNode{
    struct Node* rear;
};

struct sNode *createStack(){
    struct sNode* tmp;
    tmp = (struct sNode*)malloc(sizeof(struct sNode));
    tmp->rear = NULL;
    return tmp;
}

bool isEmpty(struct sNode* tmp){
    if(tmp->rear == NULL)return true;
    else return false;
}

void sPush(struct sNode* tmp, struct TreeLinkNode* tree){
    if(!tmp)tmp=createStack();
    struct Node* tmpNode;
    tmpNode = (struct Node*)malloc(sizeof(struct Node));
    tmpNode->tree = tree;
    tmpNode->next = tmp->rear;
    tmp->rear = tmpNode;
}

struct TreeLinkNode* sPop(struct sNode* tmp){
    if(isEmpty(tmp))return NULL;
    else{
        struct Node* tmpNode;
        tmpNode = (struct Node*)malloc(sizeof(struct Node));
        struct TreeLinkNode* tmpTree;
        tmpTree = (struct TreeLinkNode*)malloc(sizeof(struct TreeLinkNode));
        tmpNode = tmp->rear;
        tmpTree = tmpNode->tree;
        tmp->rear = tmpNode->next;
        free(tmpNode);
        return tmpTree;
    }
}
//-----------------------------------------------------//
struct TreeLinkNode* GetNext(struct TreeLinkNode* pNode ) {
    // write code here
    struct sNode* stack;
    stack = createStack();
    struct TreeLinkNode* tmp = pNode;
    struct TreeLinkNode* root;
    //找到根节点,最坏O(n)
    while (tmp) {
        root = tmp;
        tmp = tmp->next;
    }  
    //中序输出,最坏2*O(n):出入栈O(n),判断是否相等O(n)
    int flag = 0;
    while(root || !isEmpty(stack)){
        while(root){
            sPush(stack, root);
            root = root->left;
        }
        if(!isEmpty(stack)){
            root = sPop(stack);
            if(flag){
                return root;
            }
            if(root->val == pNode->val){
                flag = 1;
            }            
            root = root->right;
        }
    }
    return NULL;
}
//-----------------------------------------------------//