问题重述:
题目:输入一个二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整书中结点指针的方向。如下图:
思路解析:
首先我们知道二叉搜索树的中序遍历是有序的,因此我们可以先得到二叉搜索树的中序遍历序列,然后去修改指针即可。
代码实现:
/*
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];
}
};