二叉树的下一个结点 Apare_xzc

二叉树的下一个结点

2020.7.5
牛客链接


/*
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:
    /*
    1.如果是左子结点:
    
    */
    TreeLinkNode* GetNext(TreeLinkNode* pNode)
    {
        if(!pNode) return nullptr;
        if(!pNode->next){ //该结点是根节点,找右子树的最左结点
            if(!pNode->right) return nullptr;
            TreeLinkNode * p = pNode->right;
            while(p->left) p = p->left;
            return p;
        }
        if(pNode->next&&pNode->next->left==pNode) { //该节点是左子结点
            if(pNode->right) { //有右子树,找右子树的最左的结点
                TreeLinkNode * p = pNode->right;
                while(p->left) p = p->left;
                return p;
            }
            else return pNode->next; //没有右子树就返回父节点
        }
        else { //该节点是右子节点
            if(pNode->right) {
                TreeLinkNode * p = pNode->right;
                while(p->left) p = p->left;
                return p;
            } else { //没有右子树,找祖先中第一个为左子结点的父结点
                TreeLinkNode * p = pNode;
                while(p->next&&p->next->right==p) p = p->next;
                if(p->next&&p->next->left==p) return p->next;
                else return nullptr;
            }
            
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章