题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
1)首先说一个很简单的思路,就是先中序遍历,将序列存入数组,然后再一个个插入双向链表。额,空间复杂度太高。但是确实好简单
代码就不贴了。
2)采用递归的方法。就是首先分别将左右子树变成双向链表,然后再将两个链表合并。时间复杂降低了,空间没有分配多余的空间,下面试代码实现
/*
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==NULL)
return pRootOfTree;
TreeNode* head = Conv(pRootOfTree);
return head;
}
TreeNode* Conv(TreeNode* root)
{
if(root==NULL)
return root;
if(root->left==NULL && root->right==NULL )
return root;
TreeNode* left = Conv(root->left);
if(left!=NULL)
{
TreeNode* head = left;
while(head!=NULL && head->right!=NULL)
head = head->right;
head->right = root;
root->left = head;
}
TreeNode* right = Conv(root->right);
if(right!=NULL)
{
root->right = right;
right->left = root;
}
if(left!=NULL)
return left;
return root;
}
};