数据结构与算法——23. 用嵌套列表与链表实现树结构
文章目录
- 一、树的嵌套列表实现
- 1. 嵌套列表法的优点
- 2. python代码实现
- 二、树的链表实现
- python代码实现
一、树的嵌套列表实现
首先我们尝试用Python List来实现二叉树数据结构。
递归的嵌套列表实现二叉树,每一个节点由具有3个元素的列表([root, left, right]
)实现:
- 第1个元素为根节点的值;
- 第2个元素是左子树或左子节点(也是一个列表);
- 第3个元素是右子树或右子节点(也是一个列表)。
比如,下图所示的二叉树,它的节点的python代码实现如图片下方所示:
my_tree = ["a", # 根节点["b", # 左子树["d", [], []], ["e", [], []]], ["c", # 右子树["f", [], []], []],
]
1. 嵌套列表法的优点
子树的结构与树相同,是一种递归数据结构。很容易扩展到多叉树,仅需要增加列表元素即可。
2. python代码实现
def binary_tree(r):"""创建仅有根节点的二叉树"""return [r, [], []]def insert_left(root, new_branch):"""将新节点插入树中作为其直接的左子节点"""# 保存原来的左子树t = root.pop(1)# 左子树不为空,将new_branch作为新子树的根插入进去,原来的左子树作为新左子树的左子树if len(t) > 1:root.insert(1, [new_branch, t, []])# 左子树为空,将new_branch作为新子树的根插入进去,新子树的左子树为空else:root.insert(1, [new_branch, [], []])return rootdef insert_right(root, new_branch):"""将新节点插入树中作为其直接的右子节点"""t = root.pop(2)if len(t) > 1:root.insert(2, [new_branch, [], t])else:root.insert(2, [new_branch, [], []])return rootdef get_root_val(root):"""获取根节点的值"""return root[0]def set_root_val(root, new_val):"""设置根节点的值"""root[0] = new_valdef get_left_child(root):"""返回左子树"""return root[1]def get_right_child(root):"""返回右子树"""return root[2]
二、树的链表实现
用节点链接法来实现树。每个节点保存根节点的数据项,以及指向左右子
树的链接。
python代码实现
定义一个BinaryTree类,成员key保存根节点数据项,成员left/right_child则保存指向左/右子树的引用(同样是BinaryTree对象)。
class BinaryTree:def __init__(self, root_obj):self.key = root_objself.left_child = Noneself.right_child = Nonedef insert_left(self, new_node):# 左子树为空,直接将新子树作为左子树插入if self.left_child is None:self.left_child = BinaryTree(new_node)# 左子树不为空,将新子树作为作为左子树插入,原来的左子树作为新左子树的左子树else:t = BinaryTree(new_node)# 保存原来的左子树t.left_child = self.left_childself.left_child = tdef insert_right(self, new_node):if self.right_child is None:self.right_child = BinaryTree(new_node)else:t = BinaryTree(new_node)t.right_child = self.right_childself.right_child = tdef get_right_child(self):return self.right_childdef get_left_child(self):return self.left_childdef set_root_val(self, obj):self.key = objdef get_root_val(self):return self.key
数据结构与算法——23. 用嵌套列表与链表实现树结构相关推荐
- 4.Python数据结构及算法----无序和有序列表:链表
无序列表抽象数据类型 如上所述,无序列表的结构是项的集合,其中每个项保持相对于其他项的相对位置.下面给出了一些可能的无序列表操作. List() 创建一个新的空列表.它不需要参数,并返回一个空列表. ...
- 数据结构与算法之打印两个有序链表公共部分和判断一个链表是否具有回文结构
数据结构与算法之打印两个有序链表公共部分和判断一个链表是否具有回文结构 目录 打印两个有序链表公共部分 判断一个链表是否具有回文结构 1. 打印两个有序链表公共部分 1.问题描述 思路:Node1和N ...
- Python数据结构与算法(2.6)——块状链表
Python数据结构与算法(2.6)--块状链表 0. 学习目标 1. 块状链表简介 1.1 块状链表介绍 1.2 块状链表中结点类 1.3 块状链表中块类 2. 块状链表的实现 2.1 块状链表的初 ...
- Python数据结构与算法(一)列表和元组
本系列总结了python常用的数据结构和算法,以及一些编程实现. 参考书籍:<数据结构与算法 Python语言实现> [美]Michael T.Goodrich, Roberto Tama ...
- 数据结构与算法之hashmap散列表查找
哈希表:关键字.地址与查找 哈希查找是一种常用的查找方式,通常通过自定义函数F(关键字)来实现对于元素的查找,并返回关键字的存储地址(查找成功)或"查找失败"讯息. 散列表不同于线 ...
- python数据结构与算法:单向循环列表
单向循环列表:python实现,及其对应的 增删查检 操作 ##################### P4.9-P4.12 循环链表 ########################### #cod ...
- 【数据结构与算法】布谷鸟散列表的Java实现
编写接口IHashTable<T> public interface IHashTable<T> {int hash(T x, int which);int getNumber ...
- golang数据结构与算法——稀疏数组、队列和链表
文章目录 一 稀疏数组 1.1 先看一个实际的需求 1.2 稀疏数组基本介绍 1.3 稀疏数组举例说明 1.4 把数组转换为稀疏数组实现 1.5 把稀疏数组还原为原数组 二 队列 2.1 队列的介绍 ...
- 常考数据结构与算法:每k个节点反转链表
题目: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这 ...
最新文章
- 知识图谱构建技术初探
- ros2_object_analytics安装过程全记录
- PHP中普通方法如何调用静态属性,php中的静态属性和静态方法如何调用
- 区块链 | 基础链 ICO 白皮书分析
- 用计算机上的画图制作贺卡,用画图制作贺卡
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1094:与7无关的数
- MongoDB常用语句
- php cgi模块,PHP5模块和CGI
- 【NLP】毕业设计学习笔记(三):bert_bi-lstm代码解读
- windows下springboot集成redis
- WPF|分享一个登录界面设计
- Maven Helper 插件介绍
- r软件读取oracle数据文件,科学网—R软件之读写数据文件 - 刘永辉的博文
- Filebeat日志采集
- ipv6环境搭建来测试
- 周四见-王晓伟 |MySQL与数据仓库的数据交互
- css3弹性盒子居中总结1
- 漫步数学分析三十九——隐函数定理
- 关于Sql语句中的模糊查询like关键字详解
- 项目实战--用户消费数据分析