原創博文,轉載請注明出處!
# 題目
輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。
- 二叉樹節點的定義
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); } };