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=