題目描述
輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。
題目類別
鏈表
解題思路
代碼魯棒性:指針判空
二叉搜索樹中序遍歷就是一個排序的序列,當遍歷到根的時候,根左指向左子樹的最右節點,右子樹的最左節點指向根右
因此需要記錄遍歷的前驅節點
具體實現
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == nullptr) return nullptr;
TreeNode *pre = nullptr ;
ConvertTree(pRootOfTree, pre);
TreeNode* pRoot = pRootOfTree;
while(pRoot && pRoot->left){
pRoot = pRoot->left;
}
return pRoot;
}
void ConvertTree(TreeNode* pRoot, TreeNode* &pre){
if(pRoot == nullptr) return;
ConvertTree(pRoot->left, pre);
if(pre) {
pre->right = pRoot;
pRoot->left = pre;
}
pre = pRoot;
if(pRoot->right) ConvertTree(pRoot->right, pre);
}
};