1 """
2 Two elements of a binary search tree (BST) are swapped by mistake.
3 Recover the tree without changing its structure.
4 Example 1:
5 Input: [1,3,null,null,2]
6
7 1
8 /
9 3
10 \
11 2
12 Output: [3,1,null,null,2]
13 3
14 /
15 1
16 \
17 2
18 Example 2:
19 Input: [3,1,4,null,null,2]
20 3
21 / \
22 1 4
23 /
24 2
25 Output: [2,1,4,null,null,3]
26 2
27 / \
28 1 4
29 /
30 3
31 """
32 """
33 自己AC了一种笨方法:
34 首先对二叉树中序遍历得到inorder
35 再对inorder排序得到s_inorder
36 比较两个列表的差异,如果不相等,将两个不相等的值保存到x,y
37 第二次遍历二叉树,将值为x的设为'a',值为y的设为x。(这里不知道怎么交换值)
38 第三次遍历二叉树,将值为'a'的设为y
39 """
40 class TreeNode:
41 def __init__(self, x):
42 self.val = x
43 self.left = None
44 self.right = None
45
46 class Solution1:
47 def recoverTree(self, root):
48 """
49 Do not return anything, modify root in-place instead.
50 """
51 stack = []
52 cur = root
53 inorder = []
54 while cur or stack:
55 if cur:
56 stack.append(cur)
57 cur = cur.left
58 else:
59 cur = stack.pop()
60 inorder.append(cur.val)
61 cur = cur.right
62 s_inorder = sorted(inorder)
63 for i in range(len(s_inorder)):
64 if s_inorder[i] != inorder[i]:
65 x = s_inorder[i]
66 y = inorder[i]
67 break
68 queue = []
69 queue.append(root)
70 while queue:
71 node = queue.pop(0)
72 if node.val == x:
73 node.val = 'a'
74 if node.val == y:
75 node.val = x
76 if node.left:
77 queue.append(node.left)
78 if node.right:
79 queue.append(node.right)
80 newqueue = []
81 newqueue.append(root)
82 while newqueue:
83 _node = newqueue.pop(0)
84 if _node.val == 'a':
85 _node.val = y
86 if _node.left:
87 newqueue.append(_node.left)
88 if _node.right:
89 newqueue.append(_node.right)
90 """
91 解法二:可以再解法一得到有序的s_inorder后
92 将s_inorder覆盖到整个二叉树
93 """
94 class Solution2:
95 def recoverTree(self, root):
96 """
97 Do not return anything, modify root in-place instead.
98 """
99 stack = []
100 cur = root
101 inorder = []
102 while cur or stack:
103 if cur:
104 stack.append(cur)
105 cur = cur.left
106 else:
107 cur = stack.pop()
108 inorder.append(cur.val)
109 cur = cur.right
110 s_inorder = sorted(inorder)
111 i = 0
112 _cur = root
113 _stack = []
114 while _cur or _stack:
115 if _cur:
116 _stack.append(_cur)
117 _cur = _cur.left
118 else:
119 _cur = _stack.pop()
120 _cur.val = s_inorder[i]
121 i += 1
122 _cur = _cur.right
123
124 if __name__ == '__main__':
125 root = TreeNode(1)
126 node1 = TreeNode(3)
127 node2 = TreeNode(2)
128 root.left = node1
129 node1.right = node2
130 ans = Solution1()
131 print(ans.recoverTree(root))