二叉樹的下一個結點 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;
            }
            
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章