leetcode117 - 各ノードIIにおける移入次の右ポインタ

タイトル効果:次のノードポインタは右のバイナリツリーを各ノードに充填されています

分析:116に似ていますが、それは完璧な二分木ではないので、状況はもっと考えるべきであるため。

ケース1:最初の考慮はもはやn個のノードの最初の左端層単に左端のポインタがあるが、N + 1つのチームヘッドノードの父の最初の層を指します。だから、左端からn層を横断質問の意味と一致しています。

ケース2:もはや2としてノード116に接続されているが、直接充填される現在のノードを維持します。

コード:

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/
class Solution {
public:
    Node* connect(Node* root) {
        Node *leftmost = root;
        while(leftmost != NULL){
            // 获取leftmost
            // 不一定是该层最左,因为leftmost实指下一层的队首元素的父节点
            // 从leftmost开始遍历,连接它的下一层节点
            while(leftmost && leftmost->left == NULL && leftmost->right == NULL)
                leftmost = leftmost->next;
            if(leftmost == NULL) break;
            Node *cur = NULL; //维护当前遍历到的节点,目的是填充cur->next
            // 遍历队列
            for(Node *head = leftmost;head != NULL;head = head->next){
                if(head->left){
                    if(cur != NULL){
                        cur->next = head->left;
                    }
                    cur = head->left;
                }
                if(head -> right){
                    if(cur != NULL){
                        cur->next = head->right;
                    }
                    cur = head->right;
                }
            }
            // 获取下一层最左节点
            leftmost = leftmost->left ? leftmost->left : leftmost->right;
        }
        return root;
    }
};

 

公開された295元の記事 ウォンの賞賛4 ビュー20000 +

おすすめ

転載: blog.csdn.net/tzyshiwolaogongya/article/details/104276769