二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
进阶:
- 使用 O(n) 空间复杂度的解法很容易实现。
- 你能想出一个只使用常数空间的解决方案吗?
题目链接:https://leetcode-cn.com/problems/recover-binary-search-tree/
解法1:递归
与98题同样的思路
对二叉搜索树采用中序遍历,找到两个不符合规范的节点,然后交换他们的数值
进阶:
要求用常数的空间,我们用pre指针来存父节点,比较pre和当前指针的大小我们就能找到这两个错误的节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
class Solution { private: TreeNode *left=new TreeNode(INT_MIN); TreeNode *right=new TreeNode(INT_MIN); TreeNode *pre=new TreeNode(INT_MIN); public: void recoverTree(TreeNode* root) { midbfs(root); swap(left->val,right->val); return ; } void midbfs(TreeNode *root) { if(root!=NULL) { midbfs(root->left); if(left->val==INT_MIN&&pre->val>root->val) { left=pre; } if(pre->val>root->val) { right=root; } pre=root; midbfs(root->right); } } };
|