問題重述:
題目:輸入一個二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整書中結點指針的方向。如下圖:
思路解析:
首先我們知道二叉搜索樹的中序遍歷是有序的,因此我們可以先得到二叉搜索樹的中序遍歷序列,然後去修改指針即可。
代碼實現:
/*
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)
{
//中序遍歷所有的節點存入一個TreeeNode*的數組中
if(!pRootOfTree)
return nullptr;
vector<TreeNode*> list;
stack<TreeNode*> s;
TreeNode*p = pRootOfTree;
while(p||!s.empty())
{
while(p)
{
s.push(p);
p=p->left;
}
if(!s.empty())
{
p=s.top();
list.push_back(p);
s.pop();
p=p->right;
}
}
//修改指針
TreeNode* pre = list[0];
for(int i=1;i<list.size();++i)
{
//right指向前
//left指向後
pre->right=list[i];
list[i]->left=pre;
pre = list[i];
}
return list[0];
}
};