仅以此纪录每日LeetCode所刷题目。
题目描述:
示例:
思路:
这道题要返回的形式为:
1、该节点存在左右节点:root.val(root.left.val)(root.right.val)
2、该节点存在左节点但不存在右节点:root.val(root.left.val)
3、该节点存在右节点但不存在左节点:root.val()(root.right.val)
总结来说就是没有右节点可以省略右括号,但没有左节点不可以省略左括号。
因此这道题使用迭代方法并分成三种情况。分别是空树、无右节点和无左右节点。
代码:
# 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 tree2str(self, root: Optional[TreeNode]) -> str:
if root is None:
return ""
if root.left is None and root.right is None:
return str(root.val)
if root.right is None:
return f"{root.val}({self.tree2str(root.left)})"
return f"{root.val}({self.tree2str(root.left)})({self.tree2str(root.right)})"
题目描述:
示例:
思路:
首先我们应该了解二叉树中序遍历的顺序:左节点->中间节点->右节点
之后这道题和上面的题一样,使用迭代方法即可求解。
代码:
# 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 inOrder(self, root:TreeNode, res):
if root == None:
return
self.inOrder(root.left, res)
res.append(root.val)
self.inOrder(root.right, res)
def inorderTraversal(self, root: TreeNode) -> List[int]:
res = []
self.inOrder(root, res)
return res
题目描述:
示例:
思路:
二叉搜索树定义:左节点全部小于中间节点,右节点全部大于中间节点。
这道题使用的也是迭代方法,我们直到n = 0或1时。结果都是1。
之后随着n的增大,f(n)都可以通过f(n-1)和f(n-2)计算出来。
举个例子:
n = 2时,存在的情况为(左1中间、中间1右1)
此时f(2) = f(1) + f(1) = 2
n = 3时,存在的情况为(左2中间1、左1中间1右1、中间1右2)
此时f(3) = f(1)*f(2) + f(1)*f(1) + f(2)*f(1) =2+1+2=5
n = 4时,存在的情况为(左3中间1、左2中间1右1、左1中间1右2、中间1右3)
此时f(4) = f(3) + f(2)*f(1) + f(2)*f(1) + f(3) =5+2+2+5=14
代码:
class Solution:
def numTrees(self, n: int) -> int:
dp = [0] * (n + 1)
dp[0] = 1
dp[1] = 1
for i in range(2,n+1):
for j in range(1,i+1):
dp[i] += dp[j-1] * dp[i-j]
return dp[n]