数据结构与算法之树、二叉树、二叉搜索树

126 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情

作者: 千石
支持:点赞、收藏、评论
欢迎各位在评论区交流

前言

本文内容来自我平时学习的一些积累,如有错误,还请指正

在题目实战部分,我将代码实现和代码解释设置在了解题思路的下方,方便各位作为参考刷题

本文大纲

树、二叉树、二叉搜索树.png

一些话

本文内容来自我平时学习的一些积累,如有错误,还请指正

在题目实战部分,我将代码实现和代码解释设置在了解题思路的下方,方便各位作为参考刷题

题目练习步骤:

  1. 给自己10分钟,读题并思考解题思路
  2. 有了思路以后开始写代码,如果在上一步骤中没有思路则停止思考并且看该题题解
  3. 在看懂题解(暂时没看懂也没关系)的思路后,背诵默写题解,直至能熟练写出来
  4. 隔一段时间,再次尝试写这道题目

前置知识

树是一种类似于图的非线性数据结构,由节点和边组成。树中最多只能有一个根节点,而其他节点都有一个或多个父节点。树也被称作图的有序分支,因为它有一个根节点和多个子节点,这些子节点可以包含它们自己的子节点,产生树的形状。

二叉树

二叉树是一种特殊的树数据结构,它的每个节点最多只能有两个子节点,分别称作左子节点和右子节点。由于每个节点只有两个子节点,因此二叉树也被称作二叉分支树或二叉排序树。

二叉搜索树

二叉搜索树(BST)是一种特殊的二叉树,这种树的每个节点都具有特定的值。BST的左子节点始终小于等于右子节点,每个节点进行比较时根据这种结构对值进行比较,这使得搜索和插入更容易而快捷。BST是一种很有用的数据结构,因为它们可以被用于高效的搜索以及排序应用中。

常用模板和记忆技巧

节点定义:

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None

二叉树的前中后序遍历

// 前序遍历
def preorder(self, root):
    if root:
        self.traverse_path.append(root.val)
        self.preorder(root.left)
        self.preorder(root.right)
        
// 中序遍历
def inorder(self, root):
    if root:
        self.inorder(root.left)
        self.traverse_path.append(root.val)
        self.inorder(root.right)
        
// 后序遍历
def postorder(self, root):
    if root:
        self.postorder(root.left)
        self.postorder(root.right)
        self.traverse_path.append(root.val)

动画演示

前序遍历:

前序遍历.gif

中序遍历:

中序遍历.gif

记忆技巧

  • 前序遍历:根节点 -> 左子树 -> 右子树,可以记住“根左右”。
  • 中序遍历:左子树 -> 根节点 -> 右子树,可以记住“左根右”。
  • 后序遍历:左子树 -> 右子树 -> 根节点,可以记住“左右根”。

题目

94. 二叉树的中序遍历 - 力扣(LeetCode)

image.png

解题思路

  1. 如果根节点为空,则返回空列表。
  2. 创建一个空列表来存储中序遍历的结果。
  3. 使用递归的方式,先遍历根节点的左子树,然后将根节点的值添加到结果列表中,再遍历根节点的右子树。
  4. 返回结果列表。

题解(套模板)

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:  
        result = [] # 创建一个空列表来存储结果
        if root is None: # 检查根是否为无,并返回一个空列表
            return result
        # 遍历左子树并将数值添加到结果列表中。
        self.traverse(root.left, result) 
        result.append(root.val)
        # 遍历右子树,并将这些值添加到结果列表中。
        self.traverse(root.right, result) 
        # 返回结果列表
        return result
    def traverse(self, root, result): 
        if root is None:
            return 
        # 遍历左子树,将数值添加到结果列表中。
        self.traverse(root.left, result) 
        result.append(root.val) 
        遍历右子树,并将这些值添加到结果列表中。
        self.traverse(root.right, result)

总结

本文介绍了树、二叉树、二叉搜索树的定义、常用模板和一些解题技巧,并且讲解了一道二叉树的入门题目,希望对大家有所帮助