【代码随想录|二叉树 144.递归遍历 102.层序遍历】


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

二、层序遍历

102层序遍历

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.问题

总结

输入输出

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值