1 / \ 2 3 / \ \ 4 5 7
1 -> NULL / \ 2 -> 3 -> NULL / \ \ 4-> 5 -> 7 -> NULL
用O(1)的空間
那就利用next節點,一層一層的來遍歷好了
首先是root,咱們把它的left和right連起來
而後root切換到下一層
而後遍歷下一層的每一個節點(由於next連了的
再分別把他們的left,right什麼的連起來
用兩個變量就ok了
一個prev記錄當前層前一節點是啥(用來鏈接的
一個next記錄下一層的開始(用戶切換到下一層
/** * Definition for binary tree with next pointer. * struct TreeLinkNode { * int val; * TreeLinkNode *left, *right, *next; * TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {} * }; */ class Solution { public: void connect(TreeLinkNode *root) { TreeLinkNode* prev = nullptr; TreeLinkNode* next = nullptr; while(root) { prev = nullptr; next = nullptr; //if(next == nullptr) next = root->left ? root->left : root->right; for( ; root ; root = root->next) { if(next == nullptr) next = root->left ? root->left : root->right; if(root->left) { if(prev) prev->next = root->left; prev = root->left; } if(root->right) { if(prev) prev->next = root->right; prev = root->right; } } root = next; } } };
註釋的那一句,開始一位原本是同樣的嘛,可是仔細一想,我第一個left多是空啊,當前層的第一個是葉子節點,可是他的兄弟不是啊spa
因此要寫到循環裏面,找到第一個有left或者right的節點,而後把left或者right(left優先)賦值給nextcode