原創博文,轉載請注明出處!
# 題目
輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。
- 二叉樹節點的定義
struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
}
- 二叉搜索樹轉雙向鏈表的例子
# 思路
- 二叉搜索樹的性質
- 二叉搜索樹是左子樹<根節點<右子樹
- 二叉搜索樹的中序遍歷是遞增的有序序列
- 二叉搜索樹轉雙向鏈表的思路
- 首先:利用BST的中序遍歷得到有序序列(遞歸)
- 其次:通過調整節點指針,將有序鏈表調整為雙向鏈表
# 代碼
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == nullptr) return nullptr;
// 雙向鏈表尾節點
TreeNode* list_last = nullptr;
// 遞歸建立雙向鏈表
ConvertNode(pRootOfTree,list_last);
// 查找雙向鏈表首節點
while(list_last->left != nullptr)
{
list_last = list_last->left;
}
// 返回雙向鏈表的首節點
return list_last;
}
// 對BST中序遍歷,得到有序序列;調整序列元素的指針,將有序序列調整為雙向鏈表
void ConvertNode(TreeNode* cur,TreeNode *&list_last) // 注意形參
{
// 邊界條件(遞歸出口)
if(cur==nullptr) return ;
// 遍歷左子樹
if(cur->left != nullptr) ConvertNode(cur->left,list_last);
// 建立雙向鏈接
cur->left = list_last; // 單側鏈接
if(list_last != nullptr) list_last->right = cur; // 單側鏈接
list_last = cur;
//遍歷右子樹
if(cur->right != nullptr) ConvertNode(cur->right,list_last);
}
};


