2011-03-12 53 views
0

Ii有问题。我必须将它的锯齿形格式的二叉树转换为双向链表。
将Zigzag顺序中的二叉树转换为双向链表

 Given BT: 
       [1] 
      [2]     [3] 
     [4]  [5]   [6]  [7] 
    [8] [9] [10] [11] [12] [13] [14] [15]

ZigZag order of BT in DLL: [1] [3] [2] [4] [5] [6] [7] [15] [14] [13] [12] [11] [10] [9] [8]

这里是我的伪代码:

DLLNode* ConvertBTToZigZgDLL(Node* root) 
{ 
    DLLNode* start=createDLLNode(root->data); 
    DLLNode* tail=start; 
    Stack<Node> stack1, stack2; 
    stack1.push(root->left); 
    stack1.push(root->right); 
    while(!stack1.Empty() || !stack2.Empty()) 
    { 
    while(stack1.HasElement()) 
    { 
     Node* temp=stack1.Pop(); 
     stack2.push(temp->right); 
     stack2.push(temp->left); 
     tail=Attach(tail,createDLLNode(temp->data)); 
     tail=tail->next; 
    } 
    while(stack2.HasElement()) 
    { 
     Node* temp=stack2.Pop(); 
     stack1.push(temp->left); 
     stack1.push(temp->right); 
     tail=Attach(tail,createDLLNode(temp->data)); 
     tail=tail->next; 
    } 
    } 
    return start; 

} 这里TimeComplexity O(N),其中N是没有在给定的二叉树中的节点。


    DLLNode* Attach(DLLNode* source, DLLNode* dest) 
    { 
    source.Next=dest; 
    dest.prev=source; 
    return source; 
    } 

    DLLNode* CreateDLLNode(int data) 
    { 
    DLLNode* res=malloc(sizeof(struct DLLNode)); 
    res->data=data; 
    res->prev=NULL; 
    res->next=NULL; 
    return res; 
    }

所有我想知道什么是错在我的代码的逻辑

一个朋友在说上面的代码无法正常工作和错误的。我无法找到任何用例在我的逻辑会失败(不包括空检查/空/空节点)

只是检查我的代码的逻辑,让我知道。

我的逻辑很简单:使用2个堆叠。在堆栈1中,我总是先推动左边的孩子,然后推进右边的孩子,在堆栈2中,我总是先推动右边的孩子,然后再推动孩子第二。最初加载stack1,而stack1是非空pop,并将堆栈2中相应的右/左子节点推入。对于上面的例子,我的堆栈状态应该像s1-B [2,3] T s2-B [7,6,5,4] T s1-B [8,9,10,11,12,13,14, 15] T型堆叠底部T型堆叠顶部。请再次检查。谢谢。

+0

我的代码没有检查其他帖子中给出的任何节点的任何级别。我的关注是否我的代码的上述逻辑是否正确..这个相同的代码是其他地方..请理解并帮助我..谢谢.. – javasoul 2011-03-12 11:28:12

+0

当试图询问一个算法,这对其他人更容易批评你是否用简单的语言陈述了你想要做什么(与特定的实现相比) – 2011-03-12 13:14:43

回答

1

算法:

使用修改后的BFS算法,其中一个FIFO队列,而不是两个堆叠使用stack1用于包含在那些级别的节点进行访问从右到左,而stack2包含要被访问的节点从左到右。

该列表被初始化为根节点,并且第一级(最接近根)被存储在stack1。因此,第一次通过stack1将以适当的顺序拉第一级。

对于一般情况下的证明,假设stack1中的元素以正确的顺序存储,则从N层的stack1中拉取节点可确保按从右到左的顺序处理它们。对于每个如此处理的节点,将子树存储在第一个右侧的stack2中,然后保留。这保证节点列表检索stack2级别N + 1有从左到右的顺序。当N层没有更多节点时,while循环完成。此时,从stack2中提取节点将按从左到右的顺序从层N + 1中检索所有节点。相反,当从左到右拉动从stack2开始的节点时,首先将子节点存储在stack1左边,然后右边,确保当它们在下一次迭代中按从右到左的顺序被拉出时。

所以基本上算法证明是合理的。现在不能确保实施。特别是你将所有的NULL指针添加到堆栈中,这意味着你将检索它们,然后尝试通读它们。

+0

所有我想要的是我的逻辑工作与否。我在上星期六的采访/书面测试中给出了这个解决方案..这位面试官说,它从来没有工作..即使我问人力资源重新评估我的答案,同一个人再次表示它不会工作..他甚至没有花费超过30秒在我的答案..再次感谢..非常感谢你..我得到了我的信心..谢谢..你们帮助其他开发人员保持精神..谢谢..这个开发人员社区需要你们。 。 谢谢!我很抱歉,我无法为自己的声誉添加任何分数,因为它说我需要分钟。 15声望.. – javasoul 2011-03-14 04:28:41

+1

@javasoul:当你编写代码,并且你知道你在做什么时,你应该能够在几秒钟内提供类似于此的证明。我从算法课程中学到的一件事(在此之前我自己研究过算法)是证明是一件好事,因为它们演示算法或指出解决方案错误的地方。当面试官告诉你这是错误的,你应该加强并询问原因,解释你的推理。在采访中这通常比算法本身更重要。 – 2011-03-14 08:35:09

+0

是的。你是对的! – javasoul 2011-03-14 09:12:55

1

这已经覆盖了另一个问题。

this stackoverview set of answers

+0

不关心我的解决方案中的逻辑......我的逻辑是否正确......只有我想知道.. – javasoul 2011-03-12 11:20:45

+1

你可能是相当新的,一般来说,当你只是想表明问题已经被回答时,你应该为问题添加评论,而不是只有一个链接的答案。一旦你获得了足够的声望,你将能够*投票结束重复*,但与此同时,它习惯于只添加评论。 – 2011-03-12 13:13:09

+0

在另一篇文章中,回复没有给出标准的伪代码/给定的代码是以锯齿形打印树中的数据 - 不返回任何动态链接列表。这也是一个老去年的职位。 – javasoul 2011-03-12 13:55:00