• 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);
        }
    };
    联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
  • 相关阅读:
    Linux | Ubuntu 生成二维码实例
    Ubuntu 添加wine安装程序的快捷方式
    mysql 中文 排序
    Received disconnect from **.**).***.*** port 22:2: Too many authentication failures 解决办法
    php 数组与URL相互转换
    ssh `快捷键` 快速链接服务器
    使用ssh生成密钥并保存在不同的文件(ubuntu)
    H5移动端调试 weinre
    简单的 图片下载 php
    linux 系统生成二维码
  • 原文地址:https://www.cnblogs.com/zl1991/p/14778408.html
Copyright © 2020-2023  润新知