Leetcode: Tree

定义

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

102. 二叉树的层次遍历

有两种思路,BFS和DFS,时间复杂度都是O(n),BFS需要维护一个队列,而DFS是建立一个二维数组

# BFS
class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root: return []
        
        q = [root]
        res = []
        '''
        维护一个队列,
        逐层弹出节点,将结果添加到res,
        同时将子节点加入队列中,为下一次循环做准备
        '''
        while q:
            len_q = len(q)
            cur = []
            for _ in range(len_q): 
                node = q.pop(0)
                cur.append(node.val)
                if node.left: q.append(node.left)
                if node.right: q.append(node.right)   
            res.append(cur)
        return res
# DFS
class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root: return []
        self.result = []
        self._dfs(root, 0)
        return self.result
    
    def _dfs(self, node, level):
        if not node: return # 递归结束条件
        
		# 通过level建立数组的第一维
        if len(self.result) < level + 1:
            self.result.append([])

        self.result[level].append(node.val)

        self._dfs(node.left, level + 1)
        self._dfs(node.right, level + 1)

104/111. 二叉树的最大/小深度

# BFS,判断是否是叶子节点, 第一个到达的叶子节点就是最小深度,最后到达的就是最大深度
class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if not root: return 0
        q = [root]
        depth = 0
        while q:
            q2 = []
            for node in q:
                if node.left: q2.append(node.left)
                if node.right: q2.append(node.right)
            q = q2
            depth += 1
        return depth 
    
class Solution:
    def minDepth(self, root: TreeNode) -> int:
        # BFS
        if not root: return 0
        q = [root]
        depth = 0
        while q:
            q2 = []
            for node in q:
                if node.left: q2.append(node.left)
                if node.right: q2.append(node.right)
                if not node.left and not node.right:
                    return depth + 1
            depth += 1
            q = q2
        return
# DFS + 分治
class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        # DFS
        if not root: return 0   
        return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right))
    
class Solution:
    def minDepth(self, root: TreeNode) -> int:
        if not root: return 0
        # 特殊情况
        if not root.left: return 1 + self.minDepth(root.right)
        if not root.right: return 1 + self.minDepth(root.left)
            
        return 1 + min(self.minDepth(root.left), self.minDepth(root.right))
# DFS,当遇到叶子结点时,将其深度与最大/小值进行比较,记录最大/小值并返回
class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if not root: return 0    
        _max = 0
        for next_node in [root.left, root.right]:
            level = 1 + self.maxDepth(next_node)
            if level > _max: _max = level 
        return _max

class Solution:
    def minDepth(self, root: TreeNode) -> int:
        if not root: return 0
        # 特殊情况
        if not root.left: return 1 + self.minDepth(root.right)
        if not root.right: return 1 + self.minDepth(root.left)
        
        _min = 999
        for next_node in [root.left, root.right]:
            level = 1 + self.minDepth(next_node)
            if level < _min: _min = level 
        return _min

145. Binary Tree Postorder Traversal

迭代法

class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        res = []
        stack = []
        pre = None
        while stack or root:
            if root:
                stack.append(root)
                root = root.left
            else:
                root = stack[-1]
                # 若当前结点没有右结点,或其右节点为上一次访问的结点,则当前结点出栈
                if not root.right or root.right == pre:
                    res.append(root.val)
                    pre = root
                    root = None
                    stack.pop()
                else:
                    root = root.right
        return res

这里比较巧妙,后序遍历是左右根,前序遍历是根左右,
这里用前序遍历根右左,然后反向结果列表,更容易理解,但不容易想到

class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        if not root: return []
        stack = [root]
        res = []
        while stack:
            node = stack.pop()
            res.append(node.val)
            if node.left:
                stack.append(node.left)
            if node.right:
                stack.append(node.right)
        return res[::-1]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值