解答:
隊列實現按排遍歷
class Solution {
public:
struct InvoLevelNode
{
TreeLinkNode *node;
int level;
InvoLevelNode(TreeLinkNode *p,int n):node(p),level(n){}
InvoLevelNode(){}//重定義構造函數時,一定要把程序裏面出現情況全部構造完全
};
void connect(TreeLinkNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(root ==NULL)return ;
deque<InvoLevelNode>L;
int level = 1;
InvoLevelNode p,q;
L.push_back(InvoLevelNode(root,1));
while(L.size())
{
p = L.front();
L.pop_front();
if(p.node->left)
L.push_back(InvoLevelNode(p.node->left,p.level+1));
if(p.node->right)
L.push_back(InvoLevelNode(p.node->right,p.level+1));
if(L.size())
q= L.front();
else
{
p.node->next = NULL;
continue;
}
if(p.level == q.level)
p.node->next = q.node;
else
p.node->next = NULL;
}
}
};
查看編程之美 3.10 分層遍歷二叉樹感覺代碼更好點 如下
class Solution {
public:
void connect(TreeLinkNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(root==NULL)return;
vector<TreeLinkNode*> V;
TreeLinkNode* node;
int last = 1;
int nowp = 0;
V.push_back(root);
while(last!= nowp)
{
node = V[nowp];
if(node->left) //這個要在last更新之前做
V.push_back(node->left);
if(node->right)
V.push_back(node->right);
if(nowp == last - 1 )
{
node->next = NULL;
last = V.size();//遍歷完一層,新壓入的只有可能是下一層的元素
}
else
{
node->next = V[nowp+1];
}
nowp++;
}
}
};