计算二叉树的下一个节点

分三种情况分别讨论,注意不能访问空指针(非法访问)

/*
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==nullptr) return nullptr;
        // 第一种情况,如果一个节点有右子树,那么中序遍历中下一个元素为其右子树的最左边的节点
        if(pNode->right!=nullptr)
        {
            auto tmp_ptr = pNode->right;
            while(tmp_ptr->left){
                tmp_ptr = tmp_ptr->left;
            }
            return tmp_ptr;
        }

        if(pNode->next == nullptr)
        {
            return nullptr;
        }
        // 第二种情况,该节点无右子树,且是父节点的左节点,那么next为其父节点
        else if(pNode->next->left == pNode){
            return pNode->next;

        }

        // 第三种情况,该节点无右子树,且是父节点的右节点,
        // 那么一直网上查,查到一个左子节点a,则a的父节点就是所求
        else{
            auto tmp_ptr = pNode->next;
            if(tmp_ptr==nullptr) return nullptr;
            if(tmp_ptr->next==nullptr) return nullptr;
            while(tmp_ptr->next->left != tmp_ptr)
            {
                tmp_ptr = tmp_ptr->next;
                if(tmp_ptr==nullptr || tmp_ptr->next==nullptr)
                {
                    return nullptr;
                }
            }
            return tmp_ptr->next;

        }
    }
};