Leetcode [99] 恢复二叉搜索树 二叉树

/*
 * @lc app=leetcode.cn id=99 lang=cpp
 *
 * [99] 恢复二叉搜索树
 *
 * https://leetcode-cn.com/problems/recover-binary-search-tree/description/
 *
 * algorithms
 * Hard (61.88%)
 * Likes:    467
 * Dislikes: 0
 * Total Accepted:    55K
 * Total Submissions: 88.7K
 * Testcase Example:  '[1,3,null,null,2]'
 *
 * 给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。
 * 
 * 进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?
 * 
 * 
 * 
 * 示例 1:
 * 
 * 
 * 输入:root = [1,3,null,null,2]
 * 输出:[3,1,null,null,2]
 * 解释:3 不能是 1 左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。
 * 
 * 
 * 示例 2:
 * 
 * 
 * 输入:root = [3,1,4,null,null,2]
 * 输出:[2,1,4,null,null,3]
 * 解释:2 不能在 3 的右子树中,因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。
 * 
 * 
 * 
 * 提示:
 * 
 * 
 * 树上节点的数目在范围 [2, 1000] 内
 * -2^31 
 * 
 * 
 */

思路:

二叉树遍历(递归、非递归、mirror)

二叉搜索树的中序遍历,是有序序列,因此进行中序遍历,找到两处pre>root的地方,最后交换即可

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void recoverTree(TreeNode* root) {
        TreeNode* pre=nullptr;
        TreeNode* first=nullptr;
        TreeNode* end=nullptr;
        maketree(root,pre,first, end);
        swap(first->val,end->val);
    }
    void maketree(TreeNode* root,TreeNode*& pre,TreeNode*& first,TreeNode*& end)
    {
        if(root==nullptr)
            return;
        maketree(root->left,pre,first,end);
        if(pre!=nullptr){
            if(pre->val>root->val)
            {
                if(first==nullptr)
                    first=pre;
                end=root;
            }
        }
        pre=root;
        maketree(root->right,pre,first,end);
    }
};

 

posted @ 2021-05-17 20:32  鸭子船长  阅读(287)  评论(0编辑  收藏  举报