leetcode99 Recover Binary Search Tree

  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))

 

posted @ 2020-03-04 12:38  yawenw  阅读(154)  评论(0编辑  收藏  举报