zoukankan      html  css  js  c++  java
  • 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=
  • 相关阅读:
    彻底领悟javascript中的exec与match方法
    javascript doT 使用
    pluginstorage 插件
    html5离线储存,application cache,manifest使用体验
    window.location.hash属性介绍 ajax后退按钮失效问题
    控制textarea光标移到末尾
    webkitanylink 谷歌浏览器CSS之A:HOVER
    正则表达式详细参考文档
    复杂应用的 CSS 性能分析和优化建议
    seaJs api 帮助文档
  • 原文地址:https://www.cnblogs.com/zl1991/p/14778408.html
Copyright © 2011-2022 走看看