File tree Expand file tree Collapse file tree 1 file changed +77
-0
lines changed Expand file tree Collapse file tree 1 file changed +77
-0
lines changed Original file line number Diff line number Diff line change
1
+ // 还是二叉排序树的特点,不是单纯的左子树和右子树的关系。。。
2
+ // 下面这个只能通过一半的用例 此题要想到中序遍历
3
+ class Solution {
4
+ private:
5
+ void swap(TreeNode *&node1,TreeNode *&node2)
6
+ {
7
+ int temp = node1->val;
8
+ node1->val = node2->val;
9
+ node2->val = temp;
10
+ }
11
+ int comp(TreeNode *node)
12
+ {
13
+ if(node->left == nullptr && node->right == nullptr)
14
+ return node->val;
15
+ int left = node->left == nullptr? INT_MIN: comp(node->left);
16
+ int right = node->right == nullptr? INT_MAX:comp(node->right);
17
+ if(left > node->val && right < node->val)
18
+ swap(node->left,node->right);
19
+ else
20
+ {
21
+ if(left > node->val)
22
+ {
23
+ swap(node,node->left);
24
+ comp(node->left);
25
+ }
26
+ if(right < node->val)
27
+ {
28
+ swap(node,node->right);
29
+ comp(node->right);
30
+ }
31
+ }
32
+
33
+ return node->val;
34
+ }
35
+
36
+
37
+ public:
38
+ void recoverTree(TreeNode *root) {
39
+ if(root != nullptr)
40
+ comp(root);
41
+ }
42
+ };
43
+
44
+ // 注意这个中序遍历写的。。没有用栈!
45
+ class Solution {
46
+ TreeNode *p1,*p2,*pre ;
47
+ private:
48
+
49
+ void dfs(TreeNode *node) // 只是为了记录中被换序的那两个数
50
+ {
51
+ if(node == nullptr)
52
+ return;
53
+ dfs(node->left);
54
+ if(pre && pre->val > node->val)
55
+ {
56
+ if(p1 == nullptr)
57
+ {
58
+ p1 = pre;
59
+ p2 = node;
60
+ }
61
+ else
62
+ p2 = node;
63
+ }
64
+ pre = node;
65
+ dfs(node->right);
66
+ }
67
+
68
+ public:
69
+ void recoverTree(TreeNode *root) {
70
+ if(root == nullptr)
71
+ return;
72
+ p1 = p2 = pre = nullptr;
73
+ dfs(root);
74
+ swap(p1->val,p2->val);
75
+
76
+ }
77
+ };
You can’t perform that action at this time.
0 commit comments