二叉树算法

什么是二叉树

树描述的是节点之间的父子关系,如图所示,叶子节点是节点的子级,而子节点是根节点的子级
二叉树有三个维度:高度,深度,层级

二叉树分为三种分类:普通二叉树,完全二叉树,满二叉树

二叉树遍历的方法:

  1. 前序遍历:根节点->左子树->右子树
  2. 中序遍历:左子树->根节点->右子树
  3. 后序遍历:左子树->右子树->根节点
    如图所示,三种遍历方式

练习题

  1. 94:中序遍历

  2. 144:前序遍历

解法一

解题思路

使用迭代的方式,这里需要模拟一个栈用来存储每一个节点

代码

# 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]:
        stack = []
        res = []
        if not root:
            return res
        while stack or root:
            while root:
                res.append(root.val)
                stack.append(root)
                root = root.left
            root = stack.pop()
            root = root.right
        return res

解法二

解题思路

使用递归的方式,和迭代是等价的,只不过递归会隐形维护一个栈做节点记录

代码

# 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]:
        arr = []
        def flow_node(root):
            if not root:
                return
            arr.append(root.val)
            flow_node(root.left)
            flow_node(root.right)
        flow_node(root)
        return arr
  1. 145:后序遍历
posted @ 2022-08-10 14:26  影梦无痕  阅读(81)  评论(0)    收藏  举报