python数据结构树和二叉树简介

下面是关于“Python数据结构树和二叉树简介”的详细攻略。

一、树的概念

树(Tree)是一种非常重要的数据结构,它是由n(n>0)个有限节点组成一个具有层次关系的集合。其中一个节点被称作根节点,它没有父节点;除根节点外,其他节点都有且只有一个父节点;每个节点可以有0个或多个子节点。一棵树的深度为树中层次最大的节点层数,根节点层次为1。

二、二叉树的概念

二叉树(Binary Tree)是一种特殊的树结构,它的每个节点最多有两个子节点,分别为左子节点和右子节点。二叉树非常常见,常用于实现算法中的查找和排序等功能。

三、二叉树的遍历方式

二叉树的遍历方式主要有三种:前序遍历、中序遍历和后序遍历。

  1. 前序遍历:先访问根节点,再递归地访问左子树和右子树。代码如下:
def preorder(self, root):
    if root:
        print(root.val)
        self.preorder(root.left)
        self.preorder(root.right)
  1. 中序遍历:先递归地访问左子树,然后访问根节点,最后递归地访问右子树。代码如下:
def inorder(self, root):
    if root:
        self.inorder(root.left)
        print(root.val)
        self.inorder(root.right)
  1. 后序遍历:先递归地访问左子树和右子树,最后访问根节点。代码如下:
def postorder(self, root):
    if root:
        self.postorder(root.left)
        self.postorder(root.right)
        print(root.val)

四、二叉树的示例说明

下面给出两个二叉树的示例。

示例一

    1
   / \
  2   3
 / \
4   5

此二叉树的前序遍历结果为:1 2 4 5 3;中序遍历结果为:4 2 5 1 3;后序遍历结果为:4 5 2 3 1。

实现代码如下:

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

class Solution:
    # 前序遍历
    def preorder(self, root):
        if root:
            print(root.val)
            self.preorder(root.left)
            self.preorder(root.right)

    # 中序遍历
    def inorder(self, root):
        if root:
            self.inorder(root.left)
            print(root.val)
            self.inorder(root.right)

    # 后序遍历
    def postorder(self, root):
        if root:
            self.postorder(root.left)
            self.postorder(root.right)
            print(root.val)

if __name__ == '__main__':
    root = TreeNode(1)
    root.left = TreeNode(2)
    root.right = TreeNode(3)
    root.left.left = TreeNode(4)
    root.left.right = TreeNode(5)

    solution = Solution()
    print("preorder:")
    solution.preorder(root)
    print("inorder:")
    solution.inorder(root)
    print("postorder:")
    solution.postorder(root)

示例二

        5
      /   \
     2     8
   /  \   / \
  1   4  7   9

此二叉树的前序遍历结果为:5 2 1 4 8 7 9;中序遍历结果为:1 2 4 5 7 8 9;后序遍历结果为:1 4 2 7 9 8 5。

实现代码如下:

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

class Solution:
    # 前序遍历
    def preorder(self, root):
        if root:
            print(root.val)
            self.preorder(root.left)
            self.preorder(root.right)

    # 中序遍历
    def inorder(self, root):
        if root:
            self.inorder(root.left)
            print(root.val)
            self.inorder(root.right)

    # 后序遍历
    def postorder(self, root):
        if root:
            self.postorder(root.left)
            self.postorder(root.right)
            print(root.val)

if __name__ == '__main__':
    root = TreeNode(5)
    root.left = TreeNode(2)
    root.right = TreeNode(8)
    root.left.left = TreeNode(1)
    root.left.right = TreeNode(4)
    root.right.left = TreeNode(7)
    root.right.right = TreeNode(9)

    solution = Solution()
    print("preorder:")
    solution.preorder(root)
    print("inorder:")
    solution.inorder(root)
    print("postorder:")
    solution.postorder(root)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python数据结构树和二叉树简介 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Java数据结构之HashMap和HashSet

    Java数据结构之HashMap和HashSet HashMap 介绍 HashMap是一种基于哈希表实现的Map集合,它提供了快速的插入、查询、删除操作。HashMap中存储的元素是以键值对(Key-Value)的形式存储的,其中Key是用来从Map中查找值的索引,Value是存储在Map中的值。HashMap中的Key和Value都可以为null,但是在…

    数据结构 2023年5月17日
    00
  • [Week 18] 每日一题(C++,动态规划,线段树,数学)

    目录 [Daimayuan] T1 最长公共子序列(C++,DP,二分) 输入格式 输出格式 数据范围 输入样例 输出样例 解题思路 [Daimayuan] T2 喵喵序列(C++,序偶) 题目描述 输入格式 输出格式 样例输入 样例输出 样例说明 数据范围 双倍经验 解题思路: [Daimayuan] T3 漂亮数(C++,字符串) 输入描述 输出描述 输…

    算法与数据结构 2023年4月25日
    00
  • C语言数据结构顺序表中的增删改(头插头删)教程示例详解

    C语言数据结构顺序表中的增删改(头插头删)教程示例详解 什么是顺序表? 顺序表是一种用数组实现的线性表,所有元素存储在一块连续的存储区中。顺序表的操作包括插入、删除、查找等。 常用的顺序表操作 增加元素 删除元素 修改元素 查找元素 以下以头插和头删为例,讲解如何在C语言数据结构顺序表中实现这些操作。 头插操作 头插的实现首先需要考虑插入位置的下标,由于是头…

    数据结构 2023年5月17日
    00
  • 浅析Java 数据结构常用接口与类

    浅析 Java 数据结构常用接口与类 本文主要介绍 Java 中常用的数据结构接口和类,可以帮助读者了解和掌握常见的数据结构以及它们的实现方式,从而在日后的开发中使用它们,提高代码的效率和质量。 List 接口 List 接口是 Java 中常用的数据结构接口之一,它代表了一个有序的集合,集合中的每一个元素都可以通过其索引进行访问。List 接口的一些常用方…

    数据结构 2023年5月17日
    00
  • 手撕HashMap(二)

    这里再补充几个手撕HashMap的方法 1、remove() remove 方法参数值应该是键值对的键的值,当传入键值对的键的时候,remove 方法会删除对应的键值对 需要利用我们自己先前创建的 hashcodeList 来实现,hashcodeList 存入了所有被使用的 hashcode 值,方便后续的操作 在 put() 中,当添加新的键值对时,就会…

    算法与数据结构 2023年4月18日
    00
  • 比特币区块链的数据结构

    让我来为你详细讲解比特币区块链的数据结构。 1. 区块链的定义 比特币区块链是一个去中心化的、可追溯的、公共的、可验证的交易数据库。每一笔交易都通过哈希算法,与之前的交易连接成一个区块,形成了一个数据结构链,也就是“区块链”。 2. 区块链的数据结构 区块链的数据结构由区块、交易和哈希三部分组成: 区块 区块是区块链数据结构的基本单位,每一个区块代表着一段时…

    数据结构 2023年5月17日
    00
  • 牛客小白月赛71

    A.猫猫与广告 题目: 分析: 只需考虑c * d的矩阵竖着摆和横着摆两种情况。本题提示了考虑两矩阵对应边平行的情况,实际上可以证明倘若能斜着放,那么一定可以横着放或竖着放,证明方式可已通过构造三角形来证明a* b的矩阵的长宽一定小于c * d矩阵的长宽。 code: #include <iostream> #include <cmath&…

    算法与数据结构 2023年4月25日
    00
  • C语言数据结构旋转链表的实现

    C语言数据结构旋转链表的实现 1. 什么是旋转链表 旋转链表是一种特殊的链表,其特点是将链表的最后一个节点移动到最前面,形成一个环形链表的效果。比如下面这个链表: 1 -> 2 -> 3 -> 4 -> 5 经过一次旋转之后变成了: 5 -> 1 -> 2 -> 3 -> 4 2. 实现思路 旋转链表的实现思路…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部