数据结构与算法——二叉树介绍(附代码)

简介: 数据结构与算法——二叉树介绍(附代码)

1. 二叉树简介

首先按如下概念层级说明二叉树:数据结构 > 树 > 二叉树。

1.1 数据结构

数据结构是一种组织和存储数据的方式,它定义了一组数据元素和它们之间的关系,以及一组操作这些数据元素的规则(例如遍历、增加元素等)。数据结构可以分为线性结构(例如数组、链表等)和非线性结构(例如树、图等)。

1.2 树

树是一种非常常用的非线性数据结构,在计算机科学中被广泛应用。树是由节点和边组成的数据结构,每个节点可以连接到其他节点,最顶层的节点被称为根节点,每个节点可以没有或有若干个子节点,但是每个节点(除了根节点)都只能有一个父节点,这就形成了一个层次结构。

树的基本概念

  • 节点的度:一个节点含有的子树的个数称为该节点的度;
  • 树的度:一棵树中,最大的节点的度称为树的度;
  • 叶节点或终端节点:度为零的节点;
  • 父亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
  • 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
  • 兄弟节点:具有相同父节点的节点互称为兄弟节点;
  • 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  • 树的高度或深度:树中节点的最大层次;
  • 堂兄弟节点:父节点在同一层的节点互为堂兄弟;
  • 节点的祖先:从根到该节点所经分支上的所有节点;
  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
  • 森林:由m(m≥0)棵互不相交的树的集合称为森林;
1.3 二叉树

二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树(left subtree)和”右子树(right subtree)。二叉树的遍历方式可以是深度优先或广度优先。

二叉树的性质

  • 性质1:在二叉树的第i层上至多有 2 i − 1 2^{i-1} 2i1个结点;
  • 性质2:深度为k的二叉树至多有 2 k − 1 2^k-1 2k1个结点;
  • 性质3:对于任意一棵二叉树,如果其叶结点数为 N 0 N_0 N0,而度数为2的结点总数为 N 2 N_2 N2,則 N 0 = N 2 + 1 N_0=N_2+1 N0=N2+1
  • 性质4:具有n个结点的完全二叉树的深度必为 l o g 2 ( n + 1 ) log_2^{(n+1)} log2(n+1)
  • 性质5:对于完全二叉树,若从上至下、从左至右编号,则编号为i的结点,其左孩子编号必为2i,其右孩子编号必为2i+1,其双亲的编号必为i/2(向下取整)。

2.基于Python实现二叉树(以广度优先为例)

我们以基于Python构建下面这个二叉树为例进行代码讲解:

代码主要由以下三个类组成:

2.1 队列class queue()
class queue():
    def __init__(self):
        self.list = []
    def enqueue(self, item):
        self.list.append(item)
    def dequeue(self):
        return self.list.pop(0)
    def is_empty(self):
        return self.list
    def travel(self):  #测试用
        return self.list

其主要功能为给队列增加节点(enqueue),删减节点(dequeue),判断节点是否为空(is_empty)。

2.2 节点class Node()
class Node:   #制作节点的类
    def __init__(self, item):
        self.item = item
        self.right_child = None  #对左右子节点进行初始化
        self.left_child = None

其中self.item为该节点存储的元素,self.right_child为右子节点,self.left_child为左子节点。

注意:上面class queue()中的item是节点Node,而class Node()中的item是真正要存储的数据。

2.3 树class tree()
class Tree:   #制作树的类
    def __init__(self):
        self.root = None #初始化树根节点的值
        self.queue = queue()  #对queque进行实例化
    def add_node(self, item):
        node = Node(item)
        if self.root == None:
            self.root = node
        else:
            self.queue.enqueue(self.root)
            cur_node = self.root
            while 1:
                if cur_node.left_child == None:
                    cur_node.left_child = node
                    return
                else:
                    self.queue.enqueue(cur_node.left_child)
                if cur_node.right_child == None:
                    cur_node.right_child = node
                    return
                else:
                    self.queue.enqueue(cur_node.right_child)
                cur_node = self.queue.dequeue()     #通过出队列的方式进行遍历,这里是广度优先遍历

这段代码的核心是add_node方法,其构建思路是:①首先判断根节点self.root是否为空,如果为空则把要加的节点加到根节点,如果不为空则②把根节点作为当前节点cur_node,继续③判断如果当前节点的左子节点cur_node.left_child为空,则把要加的节点加到当前节点的左子节点,如果当前节点的左子节点cur_node.left_child不为空,则④把当前节点的左子节点cur_node.left_child加入队列self.queue,⑤右节点方法同③到④过程。最后进行出列(出栈),⑥把队列self.queue的第一个元素取出,作为当前节点cur_node,继续③到⑥整个过程,直到找到空节点用于存储要加的节点。

3. 完整代码

class queue():
    def __init__(self):
        self.list = []
    def enqueue(self, item):
        self.list.append(item)
    def dequeue(self):
        return self.list.pop(0)
    def is_empty(self):
        return self.list
    def travel(self):  #测试用
        return self.list
class Node:   #制作节点的类
    def __init__(self, item):
        self.item = item
        self.right_child = None  #对左右子节点进行初始化
        self.left_child = None
class Tree:   #制作树的类
    def __init__(self):
        self.root = None #初始化树根节点的值
        self.queue = queue()  #对queque进行实例化
    def add_node(self, item):
        node = Node(item)
        if self.root == None:
            self.root = node
        else:
            # self.queue.enqueue(self.root)
            cur_node = self.root
            while 1:
                if cur_node.left_child == None:
                    cur_node.left_child = node
                    return
                else:
                    self.queue.enqueue(cur_node.left_child)
                if cur_node.right_child == None:
                    cur_node.right_child = node
                    return
                else:
                    self.queue.enqueue(cur_node.right_child)
                cur_node = self.queue.dequeue()     #通过出队列的方式进行遍历,这里是广度优先遍历
# 构造一个这种树
#                      1
#          2.1                   2.2
#      3.1     3.2           3.3
tree_construction = Tree()
tree_construction.add_node(1)
tree_construction.add_node(2.1)
tree_construction.add_node(2.2)
tree_construction.add_node(3.1)
tree_construction.add_node(3.2)
tree_construction.add_node(3.3)
# tree_construction.add_node(3.4)
# print(tree_construction.queue.list[3].item)


相关文章
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
490 10
 算法系列之数据结构-二叉树
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
454 64
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
557 12
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
310 10
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
716 3
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
300 5
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
1977 9
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
478 4
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
503 5

热门文章

最新文章