LintCode 691. Recover Binary Search Tree

百度地图接口 # 接口示例 import urllib.parse import urllib.request import json # http://api.map.baidu.com/place/v2/search?query=ATM机&tag=银行&region=北京&output=json&ak=您的ak //GET请求 args = {'query':'ATM机',... 阅读详情
  1. Recover Binary Search Tree
    中文English
    In a binary search tree, (Only) two nodes are swapped. Find out these nodes and swap them. If there no node swapped, return original root of tree.

Example
Example1

Input: {4,5,2,1,3}
Output: {4,2,5,1,3}
Explanation:
Given a binary search tree:
4
/
5 2
/
1 3
return
4
/
2 5
/
1 3
Example2

Input: {1,2,5,4,3}
Output: {4,2,5,1,3}
Given a binary search tree:
1
/
2 5
/
4 3
return
4
/
2 5
/
1 3

解法1:
参考了
http://blog.sina.com.cn/s/blog_eb52001d0102v1z3.html
这个链接讲的很好。
具体的思路,还是通过中序遍历,只不过,不需要存储每个节点,只需要存一个前驱即可。

例如1,4,3,2,5,6

1.当我们读到4的时候,发现是正序的,不做处理
2.但是遇到3时,发现逆序,将4存为第一个错误节点,3存为第二个错误节点
3.继续往后,发现3,2又是逆序了,那么将第2个错误节点更新为2
如果是这样的序列:1,4,3,5,6同上,得到逆序的两个节点为4和3。
注意:

  1. 什么要替换第二个节点而不是第一个节点:
    e.g. The correct BST is below:
    【LeetCode】Recover Binary Search Tree
    The inorder traversal is : 1 3 4 6 7 8 10 13 14

Find the place which the order is wrong.
Wrong order: 1 3 8 6 7 4 10 13 14
FIND: 8 6
Then we find: 7 4
8, 6 是错误的序列, 但是,7,4也是错误的序列。
因为8,6前面的序列是正确的,所以8,6一定是后面的序列交换来的。
而后面的应该是比较大的数字,也就是说8一定是被交换过来的。而7,4
中也应该是小的数字4是前面交换过来的。

    用反证法来证明:
    假设:6是后面交换过来的
    推论: 那么8比6还大,那么8应该也是后面交换来的,
    这样起码有3个错误的数字了
    而题目是2个错误的数字,得证,只应该是8是交换过来的。

结论就是:我们需要交换的是:8, 4.

代码如下:

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param root: the given tree
     * @return: the tree after swapping
     */
    TreeNode * bstSwappedNode(TreeNode * root) {
        if (!root) return NULL;
        
        firstNode = NULL; secondNode = NULL; lastVisitedNode = new TreeNode(INT_MIN);   
        
        inOrderTraversal(root);
        
        if (firstNode && secondNode) swap(firstNode->val, secondNode->val);
        return root;
    }

private:
    TreeNode * firstNode, * secondNode, * lastVisitedNode;
    
    void inOrderTraversal(TreeNode * root) {
        if (!root) return;
        inOrderTraversal(root->left);
                
        if (!firstNode && root->val < lastVisitedNode->val) {
            firstNode = lastVisitedNode;
        }
        if (firstNode && root->val < lastVisitedNode->val) {
            secondNode = root;

        }
        lastVisitedNode = root;  
        
        inOrderTraversal(root->right);
    }
};

二刷:注意first节点只会更新一次,找到了之后就不变。second节点会一直更新到不能再更新为止!

class Solution {
public:
    void recoverTree(TreeNode* root) {
        if (!root) return;
        inOrderTraversal(root);
        swap(first->val, second->val);
        return;
    }
private:
    TreeNode *first = NULL, *second = NULL;
    TreeNode *prev = NULL;
    void inOrderTraversal(TreeNode *root) {
        if (!root) return;
        inOrderTraversal(root->left);
        if (prev && root->val < prev->val) {
            if (!first) first = prev;
            second = root;
        }
        prev = root;
        inOrderTraversal(root->right);
    }
};

三刷:中序非递归版本

class Solution {
public:
    void recoverTree(TreeNode* root) {
        if (!root) return;
        inOrderTraversal(root);
        swap(node1->val, node2->val);
        return;
    }
private:
    TreeNode *node1 = NULL, *node2 = NULL;
    stack<TreeNode *> stk;
    TreeNode *visited = new TreeNode(0);
    TreeNode *pre = NULL;
    void inOrderTraversal(TreeNode *root) {
        moveLeft(root);
        while (!stk.empty()) {
            TreeNode *topNode = stk.top();
            if ((!topNode->left || topNode->left == visited) && topNode->right != visited) {
                //put inorder code here
                if (pre && topNode->val < pre->val) {
                    if (!node1) node1 = pre;
                    node2 = topNode;
                }
                pre = topNode;
                moveLeft(topNode->right);
            }
            if ((!topNode->right || topNode->right == visited)) {
                //put postorder code here
                visited = topNode;
                stk.pop();
            }
        }
    }
    void moveLeft(TreeNode *root) {
        while (root) {
            //put preorder code here.
            stk.push(root);
            root = root->left;
        }
    }
};

解法2:
直接InOrder遍历,保留两个vector分别记录节点(list)和值(val)。然后将排序后的值拷贝到list里面即可。
代码如下:

class Solution {
public:
    TreeNode* bstSwappedNode(TreeNode *root) {
        vector<TreeNode*> list;
        vector<int> vals;
        inorder(root, list, vals);
        sort(vals.begin(), vals.end());
        for (int i = 0; i < list.size(); ++i) {
            list[i]->val = vals[i];
        }
        return root;
    }
    void inorder(TreeNode *root, vector<TreeNode*> &list, vector<int> &vals) {
        if (!root) return;
        inorder(root->left, list, vals);
        list.push_back(root);
        vals.push_back(root->val);
        inorder(root->right, list, vals);
    }
};
动态规划背包问题九讲:从01背包到树形依赖的完整指南 动态规划是解决最优化问题的核心算法范式,其核心思想是通过状态定义和状态转移,将复杂问题分解为重叠子问题,避免重复计算。背包问题作为动态规划的经典模型,完美诠释了这一思想,通过‘容量’与‘价值’的约束关系,为资源分配、组合优化等场景提供了高效的解决方案。在技术面试和工程实践中,背包问题及其变体(如01背包、完全背包、多重背包)是检验算法设计与问题抽象能力的重要标尺。本文以‘背包问题体系(九讲)’为核心,系统梳理了从基础的状态转移、空间优化(一维数组逆序/正序遍历),到高级的二进制优化、分组背包及树形依赖等关键 阅读详情

相关推荐

Codex Harness解析:从Agent循环到第三方模型接入的AI编程实践

在AI编程快速演进的当下,大模型如何从“聊天工具”转变为真正能执行任务的“编程Agent”,成为开发者关注的核心问题。这一转变的关键在于harness——连接模型与工程环境的运行框架,它涵盖工具调用、上下文管理、安全审批与任务循环等基础能力。理解Agent循环与上下文管理原理,是掌握现代AI编程工具价值的前提。借助OpenAI Codex这一参考实现,开发者不仅可以使用命令行完成代码修改、测试反馈闭环,还能通过OpenAI兼容接口灵活接入DeepSeek等第三方模型,低成本构建符合自身需求的智能体工作流。面

weixin_33933118的博客 392

【Lintcode】691. Recover Binary Search Tree

题目地址: https://www.lintcode.com/problem/recover-binary-search-tree/description 给定一棵二叉搜索树,题目保证没有重复数字。其中有可能有两个节点交换过。要求将该树恢复原状并返回树根。如果没交换过则返回原树树根。 思路是中序遍历。可以用栈来做。先考虑如果一个从小到大排好序的数组AAA将其中两个数交换会产生什么效果,例如(1,4,3,2)(1,4,3,2)(1,4,3,2),那么会有其中一个数比前面的数小,则两个被交换过的数,第一个一定是

数学、算法爱好者的博客 146

百度地图输入提示接口完整demo

百度地图地址提示完整demo,下载可以输入你的ak码直接可以运行,对于想了解学习百度地图接口的同学有很大帮助

Django REST framework+Vue 打造生鲜超市(三)

四、xadmin后台管理 4.1.xadmin添加富文本插件 (1)xadmin/plugins文件夹下新建文件ueditor.py 代码如下: # xadmin/plugins/ueditor.py import xadmin from xadmin.views import BaseAdminPlugin, CreateAdminView, ModelFormAdmin...

weixin_33898876的博客 421

ActualSearchReplace_v2.86_HA_XiaZaiBa.zip

ActualSearchReplace,在选定目录中的所有文件内实现文本的查找/替换工具,很好的啊啊啊啊啊啊啊啊啊。

EFK-release-1.13分支镜像3

K8s上部署EFK的镜像,这些镜像是以github官方地址build的,包括alpine-3.6、elasticsearch-v6.3.0、fluentd-elasticsearch-v2.2.0、kibana-oss-6.3.2四个镜像及其yaml文件。 这些镜像是以github release-1.13 build出来的。由于文件比较大,分了7个文件出来,分批上传

Get Post

NSLog(@"get同步"); NSString *urlStr = @"http://api.map.baidu.com/place/v2/search?query=银行&region=大连&output=json&ak=6E823f587c95f0148c19993539b99295"; // 对中文进行编码 NSString *urlStrEcode = [urlStr stringByAddingPercentEscapesUsingEncoding:N

MissQin的专栏 612

华为鲲鹏920-4826/Intel-Platinum-9242/Intel-E5-2680V2双路计算服务器的LinpackHPL benchmark对比评测

内含华为鲲鹏920-4826/Intel-Platinum-9242/Intel-E5-2680V2双路计算服务器的LinpackHPL benchmark对比评测图,含gcc/icc结果。需要积分下载些东西,感谢理解支持!

Conclusions about Deep Learning with Python

 Conclusions about Deep Learning with Python    Last night, I start to learn the python for deep learning research. It really confused me at the beginning. So, here is some conclusions about the hard ...

weixin_34405354的博客 350

Windows域账户无管理员权限也能装软件?3步搞定UAC设置(附安全提醒)

本文探讨了在Windows域环境中,如何通过配置用户账户控制(UAC)实现临时提权,让无管理员权限的域账户也能安装软件。文章详细介绍了三步走策略:临时加入本地管理员组、调整UAC行为以及至关重要的权限回收,并提供了脚本化部署方案与安全实践指南,旨在平衡企业IT管理的效率与安全。

fox11的博客 756

Zemax操作--2(单透镜和双胶合透镜优化)

单透镜 要求 镜头数据里面的数量变化后要重新设计优化函数 设计 一、初始参数 按照要求输入波长、入瞳孔径、视场数据编辑器如图 物面--透镜前表面--透镜后表面--相面(镜头数据再插入一个面如图) 将2面曲率半径F数设置为10,zemax自动给出合适值 设置面2的边缘光线高度,zemax自动给出合适值 二、评价参数设置 将面1曲率半径设置为变量 再设置评价函数告诉zemax我们需要什么条件,评价函数默认即可 执行优化 双胶合透镜 要求 ...

lzy750750的博客 1万+

ring0 SSDTHook 实现x64/x86

#include "HookSSDT.h" #include <ntimage.h> #define SEC_IMAGE 0x001000000 ULONG32 __NtOpenProcessIndex = 0; PVOID __ServiceTableBase = NULL; ULONG32 __OldNtOpenProcessOffse...

aijuzhou1959的博客 275

Keil C51开发必看:详解data/xdata/bdata内存分配陷阱与避坑指南

本文深入解析Keil C51开发中的data/xdata/bdata内存分配陷阱,提供针对51芯片的高效避坑指南。通过真实案例揭示Keil编译器的隐藏规则,分享内存优化策略和调试技巧,帮助开发者解决data溢出、xdata访问异常等典型问题,提升嵌入式开发效率。

v6b7n8m9q0的博客 1069

浅尝MOSS Search Query Web Service

  SharePoint Server 2007 Search 提供一个 Query Web Service,我们可以通过调用Web Service的方式向非SharePoint站点的客户端应用程序提供搜索功能. MOSS中搜索服务的URL是: http://Server_Name/[sites/][Site_Name/]_vti_bin/search.asmx ...

weixin_33918357的博客 117

【MT7628】固件开发-SDK4320添加MT7612E WiFi驱动操作说明

【MT7628】固件开发-SDK4320添加MT7612E WiFi驱动操作说明

wgl307293845的博客 2079

【制作100个Unity游戏之36】用unity从零开始实现类《开心消消乐》的三消类消除解压小游戏

Unity甜品消除游戏开发摘要 本文介绍了使用Unity开发甜品消除游戏的核心实现步骤: 冰块阵列生成 通过GlobalDef定义全局参数(9行7列网格) IceSpawner脚本动态生成网格化冰块阵列 添加Resolution脚本实现多分辨率适配 随机水果生成 创建FruitSpawner作为水果容器 FruitItem脚本管理水果属性(行列索引、类型) 支持动态创建水果精灵并设置位置 关键技术点 使用Instantiate动态生成预制体 通过localPosition精确控制网格布局 分辨率适配算法保持

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1289

LintCode:691.二叉搜索树交换节点

题目:分析:因为是二叉搜索树,所以最直观的做法就是采取中序遍历,得到有序的数列,其中肯定存在两处逆序,我们需要做的是把逆序部分交换使得该序列是递增的。比如题中的例子,上面的二叉树中序遍历结果为 15342,存在逆序对53和42,而下面的二叉树序列为12345,我们只需要把第一个逆序对的第一个数字和第二个逆序对的第二个数字交换即可得到12345。另外,找到这两个被交换的节点后,只需要改变这两个节点的...

HxxxxxxU的博客 600

逆向分析-SeparationPreview.aip-分色预览-结构分析(一)-x64dbg条件日志打印-命令表达式-PS脚本

从功能上分析,仅显示使用的专色这个功能,并没有触发插件接口。使用X64dbg加载illustrator进程,切换到句柄窗口,在窗口过程中,右键刷新获取界面。在x64dbg中,在UI中可以输入一些条件表达式,能够计算出对应的值,并打印在日志中。常用的,如果非暂停,输出第一个参数。参数二是utf16的指针,utf16@字符串地址,这里的字符串地址为[[ebp-108]]参数一是utf8的,utf8@字符串地址,这里的字符串地址为[ebp-28]从界面上分析,一个颜色列表,及仅显示专色的多选框组成。

插件开发 643

Atitit s2018.5 s5 doc list on com pc.docx  v2

Atitit s2018.5 s5  doc list on com pc.docx     Acc  112237553.docx Acc   Acc  112237553.docx Acc baidu netdisk.docx Acc bdp   1882176   p000000.docx Acc csdn 18821766710   attilax main num.docx Aittit...

weixin_34261415的博客 323

leaflet 综合教程170+ 【目录 】(已包含162篇文章)

vue+leaflet系列教程旨在为开发者提供简单快捷的,。在每一个示例中,解释相应的API知识点,做到。注意本示例目录中的内容可能加载是vue+openlayers的示例, 本目录是要加载vue+leaflet的示例,只是内容少,逐渐更新中。

大剑师兰特的GIS世界 1万+

【Pix4d精品教程】Pix4d空三后处理:点云分类与过滤、DSM精编生成DEM、生成等高线案例详解

本文详细介绍了利用Pix4D软件进行无人机摄影测量后处理的关键步骤,主要包括点云分类与分配、DEM精编生成和等高线绘制三个核心环节。首先通过点云分类区分地面、植被等7种地物类型,然后通过点云分配将地面点云归并到Ground类别,剔除植被等干扰要素。随后重新运行DSM生成步骤获取精确DEM,最后在附加输出中设置参数生成标准等高线。文中配有详细的操作截图和注意事项,如处理前需备份原始DSM/DOM数据,并解释了DEM与DSM的本质区别。该教程为无人机摄影测量内业处理提供了完整的解决方案。

智慧空间实验室 1万+

leetcode 随笔 Search in Rotated Sorted Array II

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.(i.e., [0,0,1,2,2,5,6] might become [2,5,6,0,0,1,2]).You are given a target value to search. If found in t...

Runner_of_nku的博客 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

LeetCode: Search in Rotated Sorted Array 解题报告

Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. I...

weixin_34161064的博客 204

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

99. Recover Binary Search Tree

题目:基础题,代码里给出了三种解答方法,其中Morris法是O(1)space。 Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing its structure. Note: A solution using O(n) spa

记录点滴 684

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

使用python及百度API对百度poi数据进行爬取(一)

档案系统初期算是告一段落了,利用一点时间继续爬取POI。和领导聊聊,受益匪浅。之前我的想法是爬取一份poi数据,直接能用;而领导听了之后,觉得更好的方式是爬取多个渠道来源的POI数据,然后做一个数据比较融合(最终事情能不能成不好说,但是经过这么一回,细节技术上有所提高,宏观把控整体项目流程能力有所长进,更重要的是通过和能人交流,以更高的眼界更宏观的看待数据、应用以及问题,这就是成长)。 我之前采用

u010723516的博客 1万+

[leetcode]74. Search a 2D Matrix(Java)

https://leetcode.com/problems/search-a-2d-matrix/#/description Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Inte

zjkC050818的博客 564
上一篇: LintCode 701. Trim a Binary Search Tree (删减BST树)
下一篇: LintCode 85 (LeetCode 701): Insert Node in a Binary Search Tree
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值