题解 | #二叉树的下一个结点#

二叉树的下一个结点

http://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e

根据中序遍历的规则,可以知道,当该结点有右子树时,返回其右子树最左边的结点。当该结点没有右子树时,则需要向上寻找第一个其左子树中包含该结点的结点。
根据这两种需求,分别写两个函数,一个通过递归找最左边的子结点,一个通过递归找向上第一个在左子树中包含该结点的点。
根结点由于其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;
    }
};
全部评论

相关推荐

HNU_fsq:建议直接出国,这简历太6了。自愧不如
点赞 评论 收藏
分享
头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
预计下个星期就能开奖吧,哪位老哥来给个准信
华孝子爱信等:对接人上周说的是这周
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务