题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
/*
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;
}
inorder(pRootOfTree);
TreeNode* root = q.front();
TreeNode* pre = nullptr;
TreeNode* cur;
while (!q.empty()) {
cur = q.front();
q.pop();
cur->left = pre;
if (pre) {
pre->right = cur;
}
pre = cur;
}
return root;
}
private:
queue<TreeNode*> q;
void inorder(TreeNode* node) {
if (node == nullptr) {
return;
}
inorder(node->left);
q.push(node);
inorder(node->right);
}
};
要求:空间复杂度O(1)(即在原树上操作),时间复杂度 O(n)
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree) {
if (pRootOfTree == nullptr) {
return nullptr;
}
TreeNode* pre = nullptr;
inorder(pRootOfTree, pre);
TreeNode* root = pRootOfTree;
while (root->left) {
root = root->left;
}
return root;
}
private:
void inorder(TreeNode* node, TreeNode*& pre) {
if (node == nullptr) {
return;
}
inorder(node->left, pre);
node->left = pre;
if (pre) {
pre->right = node;
}
pre = node;
inorder(node->right, pre);
}
};