题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
中序遍历。
版本1不知道为什么提交上去反馈死循环,样例也没有找到不对的。版本2.。。是真的精辟。。。
版本1:
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
vector<TreeNode*> result;
TreeNode* Convert(TreeNode* pRootOfTree) {
if (pRootOfTree == NULL || (pRootOfTree->left == NULL && pRootOfTree->right == NULL)) return pRootOfTree;
dfs(pRootOfTree);
int len = result.size();
pRootOfTree = result[0];
for (int i=1; i<len; ++i) {
pRootOfTree->left = result[i];
result[i]->right = pRootOfTree;
pRootOfTree = result[i];
}
pRootOfTree->left = NULL;
pRootOfTree = result[0];
return pRootOfTree;
}
void dfs(TreeNode* pRootofTree) {
if (pRootofTree == NULL) return;
dfs(pRootofTree->left);
result.push_back(pRootofTree);
dfs(pRootofTree->right);
return;
}
};
版本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;
pRootOfTree = Convert2(pRootOfTree);
while(pRootOfTree->left != NULL)
pRootOfTree = pRootOfTree->left;
return pRootOfTree;
}
TreeNode* Convert2(TreeNode* root) {
if (root->left) {
TreeNode* left = Convert2(root->left);
while(left->right) left = left->right;
left->right = root;
root->left = left;
}
if (root->right) {
TreeNode* right = Convert2(root->right);
while(right->left) right = right->left;
root->right = right;
right->left = root;
}
return root;
}
};