這是一個將二叉搜索樹轉換爲排序雙向鏈表的功能。想法是進行一次遍歷並將訪問節點放入一個大小爲2的圓形數組中。然後調整左右指針以轉換爲雙向鏈表。當前節點的右指針從不修改並稍後訪問。問題出在哪裏?將BST轉換爲排序的雙向鏈表(調試)
void TreetoQueue(node* tnode)
{static node* arr[2]={NULL,NULL};
static int index=0;
if(tnode==NULL) return;
TreetoQueue(tnode->left);
arr[index]=tnode; //current node
if(arr[1]!=NULL)
{ if(index==0)
{arr[1]->right=arr[0]; //modify right pointer of inorder predecessor to point to current node
arr[0]->left=arr[1]; //modify current node's left pointer to point to inorder predecessor
}
if(index==1)
{arr[0]->right=arr[1];
arr[1]->left=arr[0];
}
cout<<"index-"<<index<<" "<<arr[0]->val<<" "<<arr[1]->val<<"\n";
}
index=(index+1)%2;
TreetoQueue(tnode->right);
}
_______5______
/ \
___3__ 6__
/ \ \
1 4 _9
/\
7 10
index-1 1 3
index-0 4 3
index-1 4 5
index-0 6 5
index-1 6 7
index-0 9 7
index-1 9 10
node->left->left->right is NULL //Intended to be 3
node->left->right->left is NULL//intended to be 3
node->left->right->right is NULL//intended to be 5
編輯:它可以作爲intended.Only,我不得不改變根開始list.I用於其他功能做this.Could無我有一個額外的功能來實現這一點?
node* TreetoQueue2(node* root)
{node* head=root;
while(head->left!=NULL)
head=head->left;
TreetoQueue(root);
return head;
}
你說'如果(ARR [1]!= NULL)'。最初它被聲明爲NULL。之後我不會看到它改變。有什麼我失蹤? – noMAD 2012-03-07 22:42:19
arr [index] = tnode和index =(index + 1)%2.arr [1]可以在輸出中看到 – bl3e 2012-03-07 22:59:46
您可以解釋一下您奇怪的縮進方案嗎? – 2012-03-07 23:03:48