一棵二叉搜索树中的两个节点交换了位置,找出并调整。
注意点:
例子:
输入:
3
/ 1 2
输出:
2
/ 1 3
二叉搜索树的中序遍历可以使它的节点排列成一个递增的序列,那就可以把问题简化成在一个递增序列中有两个元素交换了位置。而前面的元素大于后面的元素表示顺序出错,如果整个序列就一处这样的问题,那只要交换这两个元素,如果有两处,在只有两个元素顺序有问题的前提下,应该交换第一次错位的前元素(大的元素应该往后放)与第二次错位的后元素(小元素往前放)。
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution(object):
def __init__(self):
self.node1 = None
self.node2 = None
self.pre = None
def recoverTree(self, root):
"""
:type root: TreeNode
:rtype: void Do not return anything, modify root in-place instead.
"""
self.__scan(root)
self.node1.val, self.node2.val = self.node2.val, self.node1.val
def __scan(self, root):
if root is None:
return
self.__scan(root.left)
if self.pre is not None:
if root.val < self.pre.val:
if self.node1 is None:
self.node1 = self.pre
self.node2 = root
else:
self.node2 = root
self.pre = root
self.__scan(root.right)
if __name__ == "__main__":
None
欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。
LeetCode Recover Binary Search Tree
原文:http://blog.csdn.net/u013291394/article/details/50883736