zoukankan      html  css  js  c++  java
  • 99. 恢复二叉搜索树

    给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。

    示例 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] 内
    -231 <= Node.val <= 231 - 1
     

    进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用 O(1) 空间的解决方案吗?

    class Solution {
    public:
        void recoverTree(TreeNode* root) {
            stack<TreeNode*> stk;
            TreeNode* pre = nullptr;
            TreeNode* x = nullptr;
            TreeNode* y = nullptr;
            vector<TreeNode*> res;
            while(!stk.empty() || root != nullptr) {
                while(root != nullptr) {
                    stk.push(root);
                    root=root->left;
                }
                root = stk.top();
                stk.pop();
    
                if(pre != nullptr && pre->val > root->val) {
                    if(x == nullptr) x = pre; // 第一个需要交换的元素
                    if(x != nullptr) y = root;  // 第二个需要交换的元素
                }
                pre = root;        
                root = root->right;
            }
            swap(x->val,y->val);
        }
    };
  • 相关阅读:
    数组字典
    字符串创建
    不可变数组
    数组
    纯净控制台
    可变字典
    数组Array
    id NSObject instanceType 区别
    可变字符串 插入,删除,替换,赋值
    查询字符串中某部分的字符串
  • 原文地址:https://www.cnblogs.com/zle1992/p/15644965.html
Copyright © 2011-2022 走看看