98.验证二叉搜索树(了解二叉树的性质,才是编写此道题代码的基础)
做题伤着了:这道题我做的时候,看到别人写的代码很长,懒得看,直接干。自己编写代码,没有了解平衡二叉树的性质,然后出现了下图[0,-1]、[0]的错误。我继续头铁,消灭这些错误。当我看到第三个错误的时候,我知道我错了,方向错了,改的思路都没了。
错误代码:
class Solution:
def isValidBST(self, root):
if root and not root.left and not root.right :
return True
if root.right:
if not root.left and root.right.val<=root.val:
# if root.right.val<=root.val:
return False
if root.left:
if not root.right and root.left.val >= root.val:
return False
def trval(root):
if not root.left :
return
# while root.left.val:
print(root.val)
print(root.left.val)
if root.left.val >=root.val:
return False
if not root.right:
return
if root.right.val <= root.val:
return False
trval(root.left)
trval(root.right)
if trval(root)==False :
return False
else:
return True
掌握规律后,秒解决:
掌握上述规律,直接手撕代码(中序遍历+循环——》解决战斗)-----》秒解决,不过出现了一个错误。
代码如下:
class Solution:
def isValidBST(self, root):
ddd=[]
def trval(root):
if not root:
return
trval(root.left)
ddd.append(root.val)
trval(root.right)
trval(root)
d_length=len(ddd)
print(ddd)
for i in range(1,d_length):
if ddd[i-1]>=ddd[i]:
return False
return True
还有其他方法,时间不够,二刷再做。
530.二叉搜索树的最小绝对差
会了上一道题,这道题直接秒了。
class Solution:
def getMinimumDifference(self, root):
ddd=[]
def trval( root):
if not root:
return
trval(root.left)
ddd.append(root.val)
trval(root.right)
trval(root)
d_length=len(ddd)
print(ddd)
tt=[]
for i in range(1,d_length):
tt.append(ddd[i]-ddd[i - 1])
return min(tt)
还有其他方法,时间不够,二刷再做。
501.二叉搜索树中的众数
方法一(开了新的内存):
class Solution:
def findMode(self, root: Optional[TreeNode]) -> List[int]:
ddd = []
def trval(root):
if not root:
return
trval(root.left)
ddd.append(root.val)
trval(root.right)
trval(root)
########使用对数组处理的方法
d = dict()
for item in ddd:
if item in d.keys():
d[item] += 1
else:
d[item] = 1
print(d)
def find_key(dict_input):
list_key = []
dict_key=list(dict_input.keys())
dict_value=list(dict_input.values())
for i in range(len(dict_key)):
if dict_value[i] == max(dict_value):
list_key.append(dict_key[i])
return list_key
list_key = find_key(d)
return list_key
方法二(双指针):
运行代码:
class Solution:
def __init__(self):
self.pre=TreeNode()
self.count=0
self.bijiao=0
self.cuncu=[]
def findMode(self, root: Optional[TreeNode]) -> List[int]:
self.bianli(root)
return self.cuncu
def bianli(self,root):
if not root:
return
self.bianli(root.left)
cur=root
if not self.pre:
self.count=1
elif self.pre.val==cur.val:
self.count+=1
else:
self.count = 1
if self.count>self.bijiao:
self.cuncu=[cur.val]
self.bijiao=self.count
elif self.count==self.bijiao:
self.cuncu.append(cur.val)
self.pre=cur
self.bianli(root.right)
class Solution:
def __init__(self):
self.pre=TreeNode()
self.count=0
self.bijiao=0
self.cuncu=[]
def findMode(self, root: Optional[TreeNode]) -> List[int]:
if not root:
return
self.findMode(root.left)
cur=root
if not self.pre:
self.count=1
elif self.pre.val==cur.val:
self.count+=1
else:
self.count = 1
if self.count>self.bijiao:
self.cuncu=[cur.val]
self.bijiao=self.count
elif self.count==self.bijiao:
self.cuncu.append(cur.val)
self.pre=cur
self.findMode(root.right)
return self.cuncu