二叉树的下一个节点 c++

class Solution {
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode)
    {
        if (pNode->right != nullptr)
            return findleftleaf(pNode->right);

        if (pNode->next == nullptr)
            return nullptr;
        else{
            if (pNode->next->left == pNode)
                return pNode->next;
            else {
                if (pNode->next->next == nullptr)
                    return nullptr;
                return whetherrightleaf(pNode);
            }
        }
    }

    TreeLinkNode* findleftleaf(TreeLinkNode* Node){
        //找最左叶子
        while(Node->left != nullptr){
            Node = Node->left;
        }
        return Node;
    }

    TreeLinkNode* whetherrightleaf(TreeLinkNode* Node){
        while(Node->next->right == Node){
            Node = Node->next;
            // 是最右叶子,没有后节点了
            if (Node->next == nullptr)
                return nullptr;
        }
        return Node->next;

    }
};

了解二叉树结构与中序遍历知识之后,分析思路如下:
1、如果该点有右子树,则下一个点是右子树的最左节点,函数findleftleaf()实现该功能。
2、若其无右子树,则看其父节点,如下考虑:
2.1 父节点为空,则其是没有右子树的根节点,也是中序最后一个点。
2.2 父不为空,如下考虑:
1)该点为父亲的左子,则下一个点是父节点,返回。
2)否则为右子,则一路向上寻找迭代,(函数whetherrightleaf()实现)
当某一刻该点无父节点时,说明题目给的点是树的最右节点了,返回nullptr
当某一刻该点不是父节点的右子了(也就是左子了),则他的父亲就是题中所求的下一个点了。

全部评论

相关推荐

双非坐过牢:非佬,可以啊10.28笔试,11.06评估11.11,11.12两面,11.19oc➕offer
点赞 评论 收藏
分享
我在朝九晚六双休的联想等你:如果我是你,身体素质好我会去参军,然后走士兵计划考研211只需要200多分。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务