1. 程式人生 > >leetcode 117. 填充每個節點的下一個右側節點指針 II(Populating Next Right Pointers in Each Node II)

leetcode 117. 填充每個節點的下一個右側節點指針 II(Populating Next Right Pointers in Each Node II)

常量 設置 public ref etc 圖片 lee nec 一個

目錄

  • 題目描述:
  • 示例:
  • 解法:

題目描述:

給定一個二叉樹

struct Node {
int val;
Node left;
Node
right;
Node *next;
}
填充它的每個 next 指針,讓這個指針指向其下一個右側節點。如果找不到下一個右側節點,則將 next 指針設置為 NULL

初始狀態下,所有 next 指針都被設置為 NULL

示例:

技術分享圖片

輸入:{"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":null,"right":null,"val":4},"next":null,"right":{"$id":"4","left":null,"next":null,"right":null,"val":5},"val":2},"next":null,"right":{"$id":"5","left":null,"next":null,"right":{"$id":"6","left":null,"next":null,"right":null,"val":7},"val":3},"val":1}

輸出:{"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":{"$id":"4","left":null,"next":{"$id":"5","left":null,"next":null,"right":null,"val":7},"right":null,"val":5},"right":null,"val":4},"next":{"$id":"6","left":null,"next":null,"right":{"$ref":"5"},"val":3},"right":{"$ref":"4"},"val":2},"next":null,"right":{"$ref":"6"},"val":1}

解釋:給定二叉樹如圖 A 所示,你的函數應該填充它的每個 next 指針,以指向其下一個右側節點,如圖 B 所示。

提示:

  • 你只能使用常量級額外空間。
  • 使用遞歸解題也符合要求,本題中遞歸程序占用的棧空間不算做額外的空間復雜度。

解法:

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

    Node() {}

    Node(int _val, Node* _left, Node* _right, Node* _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/
class Solution {
public:
    Node* connect(Node* root) {
        if(root == NULL){
            return root;
        }else{
            Node* head = root;
            Node* pre = NULL;
            Node* cur = head;
            while(head){
                cur = head;
                head = NULL;
                pre = NULL;
                while(cur){
                    if(cur->left){
                        if(head == NULL){
                            head = cur->left;
                        }
                        cur->left->next = cur->right;
                        if(pre == NULL){
                            pre = cur->left;
                        }else{
                            pre->next = cur->left;
                            pre = cur->left;
                        }
                    }
                    
                    if(cur->right){
                        if(head == NULL){
                            head = cur->right;
                        }
                        if(pre == NULL){
                            pre = cur->right;
                        }else{
                            pre->next = cur->right;
                            pre = cur->right;
                        }
                    }
                    cur = cur->next;
                }
            }
            return root;  
        }
    }
};

leetcode 117. 填充每個節點的下一個右側節點指針 II(Populating Next Right Pointers in Each Node II)