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型堆叠顶部。请再次检查。谢谢。
我的代码没有检查其他帖子中给出的任何节点的任何级别。我的关注是否我的代码的上述逻辑是否正确..这个相同的代码是其他地方..请理解并帮助我..谢谢.. – javasoul 2011-03-12 11:28:12
当试图询问一个算法,这对其他人更容易批评你是否用简单的语言陈述了你想要做什么(与特定的实现相比) – 2011-03-12 13:14:43