二叉树的介绍

学习堆排序时先了解下二叉树,因为堆排序中使用了二叉树。

一、二叉树介绍

二叉树(binary tree)树的每个节点最多有2个孩子节点。注意,这里是最多有2个,也可能只有1个,或者没有孩子节点。

二叉树结构如图
在这里插入图片描述

二叉树还有两种特殊的结构

  1. 满二叉树: 二叉树的所有非叶子节点都存在左右孩子,并且所有叶子节点都在同一层级上,那么这个树就是满二叉树。
    在这里插入图片描述
  2. 完全二叉树:完全二叉树的条件没有满二叉树那么苛刻,满二叉树要求所有分支都是满的;而完全二叉树只需保证最后一个节点之前的节点都齐全即可。
    在这里插入图片描述

二、二叉树的数据结构

二叉树既可以用链表表示也能使用数组来表示。以下是使用Python实现这两种表示方式的示例。

链表表示

在链表表示中,每个节点通常包含三个字段:数据字段,左子节点引用和右子节点引用。我们可以定义一个简单的Node类来表示二叉树的节点,并使用这个类来构建二叉树。
在这里插入图片描述

class Node:  def __init__(self, data):  self.data = data  self.left = None  self.right = None  # 示例:创建一个简单的二叉树  
root = Node(1)  
root.left = Node(2)  
root.right = Node(3)  
root.left.left = Node(4)  
root.left.right = Node(5)

数组表示

在数组表示中,对于索引为i的节点,其左子节点的索引为2i+1,右子节点的索引为2i+2(基于0的索引)。
在这里插入图片描述

# 示例:
binary_tree_array = [1, 2, 3, 4, 5, None, 6, None, 8]  # None代表空节点  # 获取左子节点和右子节点的函数  
def get_left_child(parent_index, array):  return array[2 * parent_index + 1] if 2 * parent_index + 1 < len(array) else None  def get_right_child(parent_index, array):  return array[2 * parent_index + 2] if 2 * parent_index + 2 < len(array) else None  # 示例:访问根节点的左右子节点  
left_child = get_left_child(0, binary_tree_array)  
right_child = get_right_child(0, binary_tree_array)  
print(f"Left child of root: {left_child}")  
print(f"Right child of root: {right_child}")

在实际应用中,链表表示更加灵活,因为用链表表示更加直观,且当树不是完全二叉树时,会浪费存储空间。在Python中,由于链表节点的动态分配和引用关系的灵活性,链表表示更为常见。

三、二叉树的遍历

因为树并不是一个线性结构,所以树的遍历并没有列表那么简单,二叉树的遍历分为以下四种:

  • 前序遍历
  • 中序遍历
  • 后序遍历
  • 层序遍历

前序遍历

遍历规则是:先根节点,再左节点,最后再是右节点。
在这里插入图片描述

class Node:def __init__(self, data):self.data = dataself.left = Noneself.right = Nonedef preorder_traversal(root):if root is None:return []result = [root.data]result += preorder_traversal(root.left)result += preorder_traversal(root.right)return result# 示例
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node4 = Node(4)
node5 = Node(5)
node6 = Node(6)
node1.left = node2
node1.right = node3
node2.left = node4
node2.right = node5
node3.right = node6
print("前序遍历:", preorder_traversal(node1))

中序遍历

遍历规则: 先左子树、再根节点、最后右子树。
在这里插入图片描述

class Node:def __init__(self, data):self.data = dataself.left = Noneself.right = Nonedef inorder_traversal(root):if root is None:return []result = inorder_traversal(root.left)result += [root.data]result += inorder_traversal(root.right)return result# 示例
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node4 = Node(4)
node5 = Node(5)
node6 = Node(6)
node1.left = node2
node1.right = node3
node2.left = node4
node2.right = node5
node3.right = node6
print("中序遍历:", inorder_traversal(node1))

后序遍历

遍历规则:先左子树、再右子树、最后根节点。
在这里插入图片描述

class Node:def __init__(self, data):self.data = dataself.left = Noneself.right = Nonedef postorder_traversal(root):if root is None:return []result = postorder_traversal(root.left)result += postorder_traversal(root.right)result += [root.data]return result# 示例
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node4 = Node(4)
node5 = Node(5)
node6 = Node(6)
node1.left = node2
node1.right = node3
node2.left = node4
node2.right = node5
node3.right = node6
print("后序遍历:", postorder_traversal(node1))

层序遍历

遍历规则:照从根节点到叶子节点的层次关系,一层一层横向遍历各个节点,从上至下,从左至右。
在这里插入图片描述

from collections import dequeclass Node:def __init__(self, data):self.data = dataself.left = Noneself.right = Nonedef levelorder_traversal(root):if root is None:return []result = []queue = deque([root])while queue:level_size = len(queue)level_nodes = []for _ in range(level_size):node = queue.popleft()level_nodes.append(node.data)if node.left:queue.append(node.left)if node.right:queue.append(node.right)result.append(level_nodes)return result# 示例
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node4 = Node(4)
node5 = Node(5)
node6 = Node(6)
node1.left = node2
node1.right = node3
node2.left = node4
node2.right = node5
node3.right = node6
print("层序遍历:", levelorder_traversal(node1))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/596766.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解压缩软件哪个好用 Mac免费解压软件哪个好 解压软件推荐 beeterzip免费下载

解压缩软件在Mac办公中是必不可少的&#xff0c;不仅能够节省时间和内存&#xff0c;更能提升传输效率。虽然Mac自带的解压缩软件归档实用工具可以对zip文件进行解压&#xff0c;但是对于他格式文件就无能为力了。 因此&#xff0c;想要满足多类型文件解压缩需求&#xff0c;可…

对于Redis,如何根据业务需求配置是否允许远程访问?

1、centos8 Redis安装的配置文件目录在哪里&#xff1f; 在 CentOS 8 中&#xff0c;默认情况下 Redis 的配置文件 redis.conf 通常位于 /etc/ 目录下。确切的完整路径是 /etc/redis.conf。 2、redis如何设置允许远程登录 修改redis.conf文件 # 继承默认注释掉的bind配置 # …

使用YOLOv8训练自己的【目标检测】数据集

文章目录 1.收集数据集1.1 使用开源已标记数据集1.2 爬取网络图像1.3 自己拍摄数据集1.4 使用数据增强生成数据集1.5 使用算法合成图像 2.标注数据集2.1确认标注格式2.2 开始标注 3.划分数据集4.配置训练环境4.1获取代码4.2安装环境 5.训练模型5.1新建一个数据集yaml文件5.2预测…

第四百四十二回 再谈flutter_launcher_icons包

文章目录 1. 概念介绍2. 使用方法3. 示例代码4. 经验与总结4.1 经验分享4.2 内容总结 我们在上一章回中介绍了"overlay_tooltip简介"相关的内容&#xff0c;本章回中将 再谈flutter_launcher_icons包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 …

Oracle 使用维进行查询重写

Oracle 使用维进行查询重写 conn / as sysdba alter user sh account unlock identified by sh; conn sh/sh query_rewrite_integrity TRUSTED --物化视图的定义 select query from user_mviews where MVIEW_NAMECAL_MONTH_SALES_MV;CREATE MATERIALIZED VIEW cal_month_s…

c# wpf XmlDataProvider 简单试验

1.概要 2.代码 <Window x:Class"WpfApp2.Window12"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend…

解决win7作为虚拟机无法复制粘贴共享文件的问题

win7作为虚拟机经常会出现无法与主机的剪切板共享、文件共享。 归根结底是win7虚拟机里面没有安装VMware Tools 能够成功安装vmware tools的条件&#xff1a; 1&#xff09;win7版本为win7 sp1及以上 2&#xff09;安装KB4490628&#xff0c;KB4474419补丁 因此下面来详细介绍…

【UnityRPG游戏制作】Unity_RPG项目之界面面板分离和搭建

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

前端学习笔记:display(未完成)

这是本人学习的总结&#xff0c;主要学习资料如下 目录 1、一般属性2、flex系列2.1、flex容器的维度2.2、flex其他的关联属性 – 1、一般属性 display是css中的一个重要属性&#xff0c;它的值基本决定了元素的布局。这里就对它的值如何影响元素布局做一个总结。 display:bl…

浅谈Redis和一些指令

浅浅谈一谈Redis的客户端 Redis客户端 Redis也是一个客户端/服务端结构的程序。 MySQL也是一个客户端/服务端结构的程序。 Redis的客户端也有多种形态 1.自带命令行客户端 redis-cli 2.图形化界面的客户端&#xff08;桌面程序&#xff0c;web程序&#xff09; 像这样的图形…

ARM、X86、RISC-V三分天下

引入&#xff1a; 简单的介绍一下X86、ARM、RISC-V三种cpu架构的区别和应用场景。 目录 简单概念讲解 1. X86架构 2. ARM架构 3. RISC-V架构 应用场景 X86、ARM和RISC-V是三种不同的CPU架构&#xff0c;它们在设计理念、指令集和应用场景上有一些区别。 简单概念讲解 1. X…

27.WEB渗透测试-数据传输与加解密(上)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;26.WEB渗透测试-BurpSuite&#xff08;五&#xff09; BP抓包网站网址&#xff1a;http:…