python
一、二叉树理论基础
class TreeNode:
def __init__(self, val, left = None, right = None):
self.val = val
self.left = left
self.right = right
比链表多了一个指针
深度优先遍历 dfs depth-fisrt-search : 前中后序遍历。深度优先,深度是小循环。
递归——栈
广度优先:层序遍历——队列
(?没理解)
二、二叉树的递归遍历
1.核心代码
代码如下(示例):
# 前序遍历-递归-LC144_二叉树的前序遍历
# 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 preorderTraversal(self, root: TreeNode) -> List[int]:
res = []
def dfs(node):
if node is None:
return
res.append(node.val)
dfs(node.left)
dfs(node.right)
dfs(root)
return res
python和c++的不同:c++的递归函数是和主函数并列的,但是python的递归函数在功能主函数的里面展开!!!
def是定义了一个函数,但是并没有使用
代码随想录这一题的答案有错,漏了
dfs(root)
2.输入输出
又头大了,第一次碰到一个类型的输入总是很头大
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def preorderTraversal(self, root):
result = []
def dfs(node):
if not node: return
result.append(node.val)
dfs(node.left)
dfs(node.right)
dfs(root)
return result
def insertLevelOrder(arr, root, i, n):
if i < n:
if arr[i] != "null":
root = TreeNode(int(arr[i]))
i=2*i+1
root.left = insertLevelOrder(arr, None, i, n)
i=i+1
root.right = insertLevelOrder(arr, None, i, n)
return root
if __name__ == "__main__":
input_str = input().strip("[]") # 例如: '1,null,2,3'
if input_str: # 确保输入非空
parts = input_str.split(",")
root = insertLevelOrder(parts, None, 0, len(parts))
solution = Solution()
result = solution.preorderTraversal(root) # output = ",".join(map(str, result))
print(output) # '1,2,3'
python的注释快捷键是ctrl+/
有[]的输入如何去掉? input_str = input().strip(“[]”)
递归思想:解决所有子问题就可以解决整体!
注意构建二叉树的时候i
二、层序遍历
1.核心代码
代码如下(示例):
class TreeNode:
def __init__(self,val, left=None, right=None):
self.val=val
self.left=left
self.right=right
# 利用长度法
class Solution:
def levelOrder(self,root):
if not root:
return []
queue = collections.deque([root]) # 创建双端队列
result=[]
while queue:
level = []
lenght=len(queue)
for _ in range(lenght):
cur = queue.popleft()
level. append(cur.val)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
result.append(level)
return result
queue = collections.deque([root])是因为deque需要一个可迭代对象,例如列表或元组。如果不加[],则会将root视为一个可迭代对象,而不是单个元素
我悟了,将root加入队列的时候,虽然root自己本身是二叉树,但是队列只会存储它的值,所以每次要自己添加这一行!!
len就是一层有一个元素的意思!!!
2.输入输出
import collections
class TreeNode:
def __init__(self,val, left=None, right=None):
self.val=val
self.left=left
self.right=right
# 利用长度法
class Solution:
def levelOrder(self,root):
if not root:
return []
queue = collections.deque([root]) # 创建双端队列
result=[]
while queue:
level = []
lenght=len(queue)
for _ in range(lenght):
cur = queue.popleft()
level. append(cur.val)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
result.append(level)
return result
def insertLevelOrder(arr, root, i, n):
if i < n:
if arr[i] != "null":
root = TreeNode(int(arr[i]))
i=2*i+1
root.left = insertLevelOrder(arr, None, i, n)
i=i+1
root.right = insertLevelOrder(arr, None, i, n)
return root
if __name__=="__main__":
input_str = input().strip("[]") # .replace("a=","")
if input_str:
parts = input_str.split(',')
root = insertLevelOrder(parts, None, 0, len(parts))
solution = Solution()
result=solution.levelOrder(root)
# output=",".join(map(str,result))
print(result)
3.问题
总结
输入输出