題目:
輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。
解題思路:
根據二叉搜索樹的特點,左子樹的結點<根節點<右子樹的結點,我們可以按照二叉樹中序遍歷的順序對該二叉樹的指針進行調整,使得二叉樹變爲一個有序的雙向鏈表。
採用遞歸的思路,先對左子樹進行轉換,
再處理根節點,讓根節點的做指針指向它的前驅節點;如果其前驅節點非空,讓其前驅節點的右指針指向當前結點。注意更新前驅節點;
最後處理右子樹,對右子樹進行轉換。
代碼實現:
void TreeToList(TreeNode* pRootOfTree, TreeNode** prev)
{
if(pRootOfTree == NULL)
return;
//先對左子樹進行轉化
TreeToList(pRootOfTree->left, prev);
//處理當前結點,讓當前結點的左指針指向中序遍歷的前驅節點,如果前驅節點非空,讓前驅節點的右指針指向當前結點
pRootOfTree->left = *prev;
if(*prev)
(*prev)->right = pRootOfTree;
//更新前驅節點
*prev = pRootOfTree;
//在對右子樹進行轉化
TreeToList(pRootOfTree->right, prev);
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == NULL)
return NULL;
//查找鏈表的頭結點
TreeNode* head = pRootOfTree;
while(head->left != NULL)
{
head = head->left;
}
//根據中序遍歷的思路進行轉換
TreeNode* prev = NULL;
TreeToList(pRootOfTree, &prev);
return head;
}