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