这个题目正常解不难,难的是需要常数空间的解法。所以说,不管是递归还是迭代,都无法满足这个题目的需要。只能像有的链表那样从树中搜索,原位修改。
实在想不出解题思路了,还是对时间复杂度了解的多,空间复杂度了解的少,看了题解写出的代码。。。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void recoverTree(TreeNode* root) {
TreeNode* x = nullptr;
TreeNode* y = nullptr;
TreeNode* pred = nullptr;
TreeNode* pre = nullptr;
while (root != nullptr) {
if (root->left != nullptr) {
pre = root->left;
while (pre->right != nullptr && pre->right != root) pre = pre->right;
if (pre->right == nullptr) {
pre->right = root;
root = root->left;
}
else {
if (pred != nullptr && root->val < pred->val) {
y = root;
if (x == nullptr) x = pred;
}
pred = root;
pre->right = nullptr;
root = root->right;
}
}
else {
if (pred != nullptr && root->val < pred->val) {
y = root;
if (x == nullptr) x = pred;
}
pred = root;
root = root->right;
}
}
int temp=x->val;
x->val=y->val;
y->val=temp;
}
};
执行耗时非常长得分很低,但是就应该长,因为morris遍历将每个节点都遍历了两遍。