题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
题目中所给的是一颗二叉搜索树,在此树中:
若左子树不空,左子树均小于根节点;
若右子树不空,右子树均大于根节点。
要求转换为一个排序双向链表,且不能采用额外节点空间,那么采用中序遍历,将二叉搜索树中的节点按元素值从小到大的顺序压入容器中,然后将容器进行遍历,使每一个节点的右指针指向下一个索引的节点,下一个索引节点的左子树指向前一个节点,完成双向的指针分配。
5
3 7
2 4 6 8
如上二叉搜索树,经过中序遍历后,顺序为2 3 4 5 6 7 8,则将2的右指针作为后继指针指向3,3的左指针作为前继指针指向2,以此类推。
代码如下:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void Tra(TreeNode* root)
{
if(root==NULL)
{
return;
}
Tra(root->left);
vec.emplace_back(root);
Tra(root->right);
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==NULL)
{
return NULL;
}
Tra(pRootOfTree);
auto len=vec.size();
for(int i=0;i<len-1;i++)
{
vec[i]->right=vec[i+1];
vec[i+1]->left=vec[i];
}
return vec[0];
}
private:
vector<TreeNode*> vec;
};