有意思,看了题意,我只想说一句:上一题的方法依然好使,我只把64改成640就提交通过了。我却迷惑了,任意的二叉树640层完全不够用呀,1000层,10000层也有可能呀,难道还有什么更好的方法吗?
想到了层次遍历的方法,这样,对于任意的二叉树层次遍历开辟的空间取决于二叉树的最大宽度,而不是最大深度(上面的方法是),试了试也能通过,虽然层次遍历没用递归,但时间并没有减少多少,可能是编译器测试用例不够吧,这题感觉还是层次遍历更好点。两种方法如下:
TreeLinkNode* layers[640];
void preOrderLayer(TreeLinkNode *root,int layer)//,TreeLinkNode *&layers
{
if (layers[layer]==NULL)
{
layers[layer] = root;
}
else
{
layers[layer]->next = root;
layers[layer] = root;
}
if(root->left)
preOrderLayer(root->left,layer+1);
if(root->right)
preOrderLayer(root->right,layer+1);
}
void connect(TreeLinkNode *root) {
if(root==NULL)
return ;
for (int i=0;i<640;i++)
layers[i] = NULL;
int layer = 0;
preOrderLayer(root,layer);
for (int i=0;i<640&&layers[i]!=NULL;i++)
{
layers[i]->next = NULL;
}
}
struct QueNode{
int num;
TreeLinkNode *pTreeLinkNode;
QueNode():num(0),pTreeLinkNode(NULL){}
};
void connect02(TreeLinkNode *root) {
if(root==NULL)
return ;
queue<QueNode> que;
QueNode qn;
qn.num = 0;
qn.pTreeLinkNode = root;
que.push(qn);
QueNode tempNode,tempLeftNode,tempRightNode;
int lastnum = 0;
TreeLinkNode *plast = NULL;
while(!que.empty())
{
tempNode = que.front();
que.pop();
if (lastnum!=tempNode.num)
{
plast->next = NULL;
lastnum = tempNode.num;
plast = tempNode.pTreeLinkNode;
}
else
{
if(plast)
plast->next = tempNode.pTreeLinkNode;
plast = tempNode.pTreeLinkNode;
}
if (tempNode.pTreeLinkNode->left)
{
tempLeftNode.num = tempNode.num+1;
tempLeftNode.pTreeLinkNode = tempNode.pTreeLinkNode->left;
que.push(tempLeftNode);
}
if (tempNode.pTreeLinkNode->right)
{
tempRightNode.num = tempNode.num+1;
tempRightNode.pTreeLinkNode = tempNode.pTreeLinkNode->right;
que.push(tempRightNode);
}
}
plast->next = NULL;
}