解答:
队列实现按排遍历
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++;
}
}
};