LeetCode-99. 恢复二叉搜索树

   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) 空间复杂度的解法很容易实现。
你能想出一个只使用常数空间的解决方案吗?

1. 中序遍历,存储数组

2. 排序数组

3. 重新赋值,恢复二叉树

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
    void recoverTree(TreeNode* root) {
        if(root==NULL)
            return;
        TreeMidVal(root);
        TreeMidSort();
        recover(root);
    }

private:
    vector<int> vec_val;

    /* 中序遍历 */
    void TreeMidVal(TreeNode *root){
        if(root==NULL)
            return;
        TreeMidVal(root->left);
        vec_val.push_back(root->val);
        TreeMidVal(root->right);
    }

    /* 排序 */
    void TreeMidSort(){
        sort(vec_val.begin(),vec_val.end());
    }

    /* 恢复 */
    void recover(TreeNode *root){
        if(root==NULL)
            return;

        recover(root->left);

        /* 赋值 */
        root->val = vec_val.front();
        vec_val.erase(vec_val.begin());

        recover(root->right);
    }
};

int main(){
    Solution *ps = new Solution();
    TreeNode *root = new TreeNode(1);
    TreeNode *l1 = new TreeNode(3);
    TreeNode *r2 = new TreeNode(2);
    root->left = l1;
    l1->right = r2;

    ps->recoverTree(root);

    return 0;
}

发布了245 篇原创文章 · 获赞 57 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/qq_16542775/article/details/103235354