LeetCode刷题笔记 99. 恢复二叉搜索树

99. 恢复二叉搜索树

  • 题目要求
  • 题解
    • 中序遍历法 O(n)
    • Morris 中序遍历

题目要求

二叉搜索树中的两个节点被错误地交换。

请在不改变其结构的情况下,恢复这棵树。

示例 1:

输入: [1,3,null,null,2]

   1
  /
 3
  \
   2

输出: [3,1,null,null,2]

   3
  /
 1
  \
   2
   
示例 2:

输入: [3,1,4,null,null,2]

  3
 / \
1   4
   /
  2

输出: [2,1,4,null,null,3]

  2
 / \
1   4
   /
  3

进阶:

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

题解

中序遍历法 O(n)

class Solution {
private:
    TreeNode *t1,*t2,*pre;
public:
    void recoverTree(TreeNode* root) {
        inorder(root);
        int tmp=t1->val;
        t1->val=t2->val;
        t2->val=tmp;        
    }
    void inorder(TreeNode *root){
        if(!root) return;
        inorder(root->left);
        if(pre!=nullptr&&pre->val>root->val){
            if(t1==nullptr) t1=pre;
            t2=root;
        }
        pre=root;
        inorder(root->right);
    }
};

Morris 中序遍历

morris遍历详解(实现树的前中后序遍历)
遍历二叉树的神级方法(Morris遍历)

你可能感兴趣的:(Leetcode)