99. 恢复二叉搜索树

99. 恢复二叉搜索树

思路

给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树

示例 1:

img

输入:root = [1,3,null,null,2]
输出:[3,1,null,null,2]
解释:3 不能是 1 的左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。

示例 2:

img

输入:root = [3,1,4,null,null,2]
输出:[2,1,4,null,null,3]
解释:2 不能在 3 的右子树中,因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。

提示:

  • 树上节点的数目在范围 [2, 1000]
  • -231 <= Node.val <= 231 - 1

进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用 O(1) 空间的解决方案吗?
思路: 二叉搜索树的特性在于中序遍历的升序的,所以只要利用这一点,找出错误的两个数调换位置即可。

class Solution {
public:
    TreeNode* first=nullptr;
    TreeNode* second=nullptr;
    TreeNode* prev=new TreeNode(INT_MIN);
    void recoverTree(TreeNode* root) {
        //遍历 找出值位置错误的点
        inorderTraverse(root);

        int temp=first->val;
        first->val=second->val;
        second->val=temp;
    }
    void inorderTraverse(TreeNode* root){
        //终止条件
        if(root==nullptr){
            return;
        }
        inorderTraverse(root->left);
        //中序遍历
        if(root->val<prev->val){
            //root不符合有序性
            if(first==nullptr){
                //第一个错位节点是prev
                first=prev;
            }
            //第二个错位节点是second
            second=root;
        }

        prev=root;
        inorderTraverse(root->right);
    }
};
posted @ 2022-04-11 09:41  BailanZ  阅读(23)  评论(0编辑  收藏  举报