最近在用python刷题,但是写着各种出问题,什么变量名用错啊之类的低级错误。总感觉存在实现的障碍,写着很不爽,可能随着python代码量的增加会好很多吧。
这道题是说在一棵正确的二叉搜索树中有两个node的值发生了交换,让你在不改变树的结构的情况下,将原本的二叉搜索树还原回来。
这道题还是挺有意思的哈,本来一棵规整的搜索树,根据其递归的定义,当前节点左边的值大于其左子树的值,小于其右子树的值。于是如果存在任意两个节点值发生交换的话,只能是如下的三种情况:
(1)当前节点与其左子树的某个节点值发生交换,因此左子树的最大值大于当前节点值;
(2)当前节点与其右子树的某个节点值发生交换,因此右子树的最小值小于当前节点值;
(3)当前节点分别属于左右子树中的某两个节点发生了交换,因此此时存在左子树的最大值大于当前节点值,并且右子树的最小值小于当前节点值。
因此只需要对上面三种情况,找到相应的节点,交换回来就可以了。还是挺简单的,奉上python代码吧:
# Definition for a binary tree node
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# @param root, a tree node
# @return a tree node
def recoverTree(self, root):
if root == None:
return None
leftFlag = False
rightFlag = False
leftMax = 1
if root.left != None:
leftMax = self.findMax(root.left)
if leftMax.val > root.val:
leftFlag = True
rightMin = 1
if root.right != None:
rightMin = self.findMin(root.right)
if rightMin.val < root.val:
rightFlag = True
if leftFlag==True and rightFlag==True:
self.swapVal(leftMax, rightMin)
elif leftFlag==True:
self.swapVal(root, leftMax)
elif rightFlag == True:
self.swapVal(root, rightMin)
else:
if root.left != None:
self.recoverTree(root.left)
if root.right != None:
self.recoverTree(root.right)
return root
def swapVal(self, a, b):
temp = a.val
a.val = b.val
b.val = temp
def findMax(self, root):
if root == None:
return None
ans = root
if root.left != None:
left = self.findMax(root.left)
if ans.val < left.val:
ans = left
if root.right != None:
right = self.findMax(root.right)
if ans.val < right.val:
ans = right
return ans
def findMin(self, root):
if root == None:
return None
ans = root
if root.left != None:
left = self.findMin(root.left)
if ans.val > left.val:
ans = left
if root.right != None:
right = self.findMin(root.right)
if ans.val > right.val:
ans = right
return ans