題目:輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。
思路:中序遍歷二叉搜索樹,得到的序列就是有序的。如果沒有後面的要求,就可以先通過前序遍歷得到一個方向的鏈表,再新建節點,實現雙向鏈表。在搜索二叉樹中,左子節點的值總是小於父節點的值,右子節點的值總是大於父節點的值
劍指offer的思路:在將二叉搜索樹轉換成排序雙向鏈表時,原先指向左子節點的指針調整爲鏈表中指向前一個節點的指針,原先指向右子節點的指針調整爲鏈表中指向後一個節點的指針。可以把二叉搜索樹分爲三部分,根節點的左子樹,根節點,根節點的右子樹。左子樹右子樹的遍歷轉換過程是一樣的,得到的直接就是排好序的序列,根節點有所不同。使用遞歸的方法。但劍指書中提供的代碼包括很多指針和指向指針的指針,閱讀起來很繁瑣。
這個題的思路可以理解,但編碼沒怎麼看懂。討論區的遞歸方法、、、唉
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
TreeNode* pLast = nullptr;
ConverNode(pRootOfTree,&pLast);
TreeNode* pHead = pLast;
while(pHead != nullptr && pHead->left != nullptr)
pHead = pHead->left;
return pHead;
}
void ConverNode(TreeNode* pNode,TreeNode** pLast){
if(pNode == nullptr)
return;
TreeNode* pCurrent = pNode;
if(pCurrent->left != nullptr)
ConverNode(pCurrent->left,pLast);
pCurrent->left = *pLast;
if(*pLast != nullptr)
(*pLast)->right = pCurrent;
*pLast = pCurrent;
if(pCurrent->right != nullptr)
ConverNode(pCurrent->right,pLast);
}
};
思路二(討論區的大神)