[leetcode_99]Recover Binary Search Tree

交换二叉搜索树的两个节点,要求复原。
不确定我的做法对不对,我只是在 value 的程度上把他们复原了。但是原文说不要破坏他们的结构?
想法很简单中序遍历+线性数组纠正

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
class Solution {
public:
    void recoverTree(TreeNode *root) {
        if(root == NULL)return ;
        treeArray.clear();
        inOrder(root);
        int x,y;
        int flag = 0;
        for(int i = 0;i < treeArray.size();i++) {
            if(i == 0 && treeArray[i] > treeArray[i+1] && i < treeArray.size()-1) {
                if(flag == 0) {
                    x = i;
                    flag = 1;
                }
                else {
                    y = i;
                }
                continue;
            }
            if(i == treeArray.size()-1 && treeArray[i] < treeArray[i-1] && i > 0) {
                if(flag == 0) {
                    x = i;
                    flag = 1;
                }
                else {
                    y = i;
                }
                continue;
            }
            if( i > 0 && i < treeArray.size()-1 && treeArray[i] > treeArray[i-1] && treeArray[i] > treeArray[i+1]) {
                if(flag == 0) {
                    x = i;
                    flag = 1;
                }
                else {
                    y = i;
                }
                continue;
            }
            if( i > 0 && i < treeArray.size()-1 && treeArray[i] < treeArray[i-1] && treeArray[i] < treeArray[i+1] ) {
                if(flag == 0) {
                    x = i;
                    flag = 1;
                }
                else {
                    y = i;
                }
                continue;
            }
        }
        if(flag == 0) {
            for(int i = 0;i < treeArray.size()-1;i++) {
                if(treeArray[i] > treeArray[i+1]) {
                    x = i;
                    y = i+1;
                    break;
                }
            }
        }
        queryTree(root,x,y);
    }
private:
    vector<int> treeArray;
    void inOrder(TreeNode * root) {
        if(root->left != NULL)
            inOrder(root->left);
        treeArray.push_back(root->val);
        if(root->right != NULL)
            inOrder(root->right);
    }
    void queryTree(TreeNode * root,int x,int y) {
        if(root->val == treeArray[x]) {
            root->val = treeArray[y];
        }
        else 
            if (root->val == treeArray[y]){
                root->val = treeArray[x];
            }
        if(root->left != NULL)
            queryTree(root->left,x,y);
        if(root->right != NULL)
            queryTree(root->right,x,y);
    }
};
Licensed under CC BY-NC-SA 4.0