Skip to content

Commit 9f6c787

Browse files
committed
二叉排序树-》 中序遍历-》 得有序集
1 parent 2c7177c commit 9f6c787

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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+
};

0 commit comments

Comments
 (0)