94-99 好久没来打卡啦 , 对不起。 我真的讨厌二叉树
我发现力扣 B站这种登录的电脑多了 之前的就会被挤掉 好麻烦0.0
94:中序遍历
不多讲了 递归真好写
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: rel = [] def mintra(node): if node!= None: if node.left != None: mintra(node.left) rel.append(node.val) if node.right!= None: mintra(node.right) mintra(root) return rel 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/solution/di-gui-zhen-hao-xie-wo-du-bu-xiang-xie-f-5mb5/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
95
:不同的二叉搜索树 2
本以为需要返回列表 得题解才知,需要的是返回一颗大树 可叹可叹
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def generateTrees(self, n: int) -> List[TreeNode]: def generateTrees(start, end): if start > end: return [None] alltree = [] for i in range(start,end+1): lefttree = generateTrees(start,i-1) righttree = generateTrees(i+1,end) for ltree in lefttree: for rtree in righttree: curtree = TreeNode(i) curtree.left = ltree curtree.right = rtree alltree.append(curtree) return alltree return generateTrees(1, n) if n else [] 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii/solution/ben-yi-wei-xu-yao-fan-hui-lie-biao-de-ti-xnht/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
96 不同的二叉搜索树 力扣把2放前面放上瘾了
第一次递归竟然超时了,,,
痛定思痛,想了想,可以把长度为n的位数都记录下来啊
但是还想着写成递归的形式
再想想 递归 递个P
两个循环搞定
要注意的是 i表示的是二叉树有多少个结点 所以从1开始 到n结束
j表示的是左结点有几个结点 从1开始 i结束 范围是0到i-1
class Solution: def numTrees(self, n: int) -> int: num_count = [1,1] for i in range(2,n+1): curcount = 0 for j in range(1,i+1): curcount += num_count[j-1]*num_count[i-j] num_count.append(curcount) return num_count[n] 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/unique-binary-search-trees/solution/mo-mo-mo-mo-mo-mo-shu-zu-ji-lu-jie-guo-y-qypd/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
97 交错字符串
第一反应回溯 但是超时了 看答案是dp 结果写对了
思路就是看S1 的前I个和S2的前j个能不能表示 s3的前i+j个
注意的是 True的传播要分为从上面来还是从左边来
我行数表示s2的长度 列数是s1的长度
从左边来 说明要加入s1的元素 就比较s1那一位
从上面来 说明要加入s2的元素 就比较s2那一位
class Solution: def isInterleave(self, s1: str, s2: str, s3: str) -> bool: #超时的回溯 # n1 = len(s1) # n2 = len(s2) # n3 = len(s3) # if n3 != n1+ n2: # return False # def dfs(start1,start2,start3): # if start1 == n1 : # if s2[start2:] == s3[start3:]: # return True # else: # return False # if start2 == n2 : # if s1[start1:] == s3[start3:]: # return True # else: # return False # if s1[start1] == s3[start3] or s2[start2] == s3[start3]: # flag1 = False # flag2 = False # if s1[start1] == s3[start3] : # flag1 = dfs(start1+1,start2,start3+1) # if s2[start2] == s3[start3]: # flag2 = dfs(start1,start2+1,start3+1) # return (flag2 or flag1) # else: # return False # return dfs(0,0,0) n1 = len(s1) n2 = len(s2) n3 = len(s3) if n3 != n1+ n2: return False dp = [[False] * (n1+1) for j in range(n2+1)] dp[0][0] = True for col in range(1,n1+1): if dp[0][col-1] == True and s1[col-1] == s3[col-1]: dp[0][col] = True else: break for row in range(1,n2+1): if dp[row-1][0] == True and s2[row-1] == s3[row-1]: dp[row][0] = True else: break for row in range(1,n2+1): for col in range(1,n1+1): if dp[row-1][col] == True and s2[row-1] == s3[row+col-1]: dp[row][col] = True if dp[row][col-1] == True and s1[col-1] == s3[row+col-1]: dp[row][col] = True return dp[n2][n1] 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/interleaving-string/solution/di-yi-fan-ying-hui-su-dan-shi-chao-shi-l-qcc0/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
98 验证二叉搜索树
中序遍历 不多说了
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def isValidBST(self, root: TreeNode) -> bool: flag = True cur = -2**31-1 def midtran(node): nonlocal flag nonlocal cur if node.left: midtran(node.left) if flag: if node.val <= cur: flag = False return False cur = node.val if node.right: midtran(node.right) midtran(root) return flag 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/validate-binary-search-tree/solution/di-gui-de-zhong-xu-bian-li-by-yizhu-jia-2wf8/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
99:恢复二叉搜索树
我跟答案不一样啊
中序遍历
找到第一个比后面结点大的结点 就是交换的前一个结点 称为WRONGNODE
找到最后一个比WRONGNODE小的结点 交换他们。
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def recoverTree(self, root: Optional[TreeNode]) -> None: """ Do not return anything, modify root in-place instead. """ tempnode = TreeNode(val=-2**31-1) flag = True wrongnode = None def midtran(node): nonlocal flag nonlocal tempnode nonlocal wrongnode if node.left: midtran(node.left) if flag: if node.val < tempnode.val: flag = False wrongnode = tempnode return else: tempnode = node if node.right: midtran(node.right) def midtran2(node): nonlocal flag nonlocal tempnode nonlocal wrongnode if node.left: midtran2(node.left) if node.val < wrongnode.val: tempnode = node if node.right: midtran2(node.right) midtran(root) midtran2(root) tempnode.val,wrongnode.val = wrongnode.val,tempnode.val 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/recover-binary-search-tree/solution/ahhahaha-zhe-ye-xing-xie-de-luan-qi-ba-z-3tws/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。