算法训练记录day14

二叉树

  1. 前序遍历 (中左右)

# 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: Optional[TreeNode]) -> List[int]:
#         result = []
#         def traversal(root:TreeNode):
#             if root == None:        # 如果节点为空,直接返回
#                 return
#             result.append(root.val)     # 前序
#             traversal(root.left)        # 左
#             traversal(root.right)       # 右      
#         traversal(root)
#         return result
class Solution:
    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res = [] 
        stack = [root]        # stack中已经加入了一个元素
        if not root :
            return []
        while stack :
            node = stack.pop()  # 节点的位置 堆的最后一个元素        node不断更新
            res.append(node.val)    # 让其加入res中
            if node.right :        # 把右节点放入栈中
                stack.append(node.right)
            if node.left:           # 把左节点放入栈中
                stack.append(node.left)
        return res
  1. 中序遍历 (左中右)

# 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: Optional[TreeNode]) -> List[int]:
#         result = []
#         def traversal(root:TreeNode):
#             if root == None:        # 如果节点为空,直接返回
#                 return
#             traversal(root.left)        # 左
#             result.append(root.val)     # 中序 中 
#             traversal(root.right)       # 右   
              
#         traversal(root)
#         return result
class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root :
            return []
        stack = []
        cur = root  # 指向根节点
        res = []
        while stack or cur:  # 这里root和cur是不一样的 cur是会变的
            if cur :            # 先一路找到左子树的节点,放入栈中       
                stack.append(cur)
                cur = cur.left
            else :              # 一旦cur为空,即没有左节点了
                cur = stack.pop()   # 先把stack的最后一个弹出
                res.append(cur.val) # 把弹出的元素加到res中
                cur = cur.right # 再来判断它有没有右节点
        return res
  1. 后序遍历 (左右中)

前序(中左右) 利用其流程,先 中右左 再反转为 左右中

# 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 postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
#         result = []
#         def traversal(root:TreeNode):
#             if root == None:        # 如果节点为空,直接返回
#                 return
#             traversal(root.left)        # 左
#             traversal(root.right)       # 右   
#             result.append(root.val)     # 后序 中   
#         traversal(root)
#         return result
class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root :
            return []
        res = []
        stack = [root]
        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]        # 逆序输出
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值