[leetcode]Populating Next Right Pointers in Each Node II
Posted on 2014-01-15 17:15 1957 阅读(1620) 评论(1) 编辑 收藏 举报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可能是空啊,当前层的第一个是叶子节点,但是他的兄弟不是啊
所以要写到循环里面,找到第一个有left或者right的节点,然后把left或者right(left优先)赋值给next
by 1957