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=
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2017-05-17 理解Android进程创建流程(转)