IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Python Tree 树 - BinaryTree 二叉树 - BinaryHeap 二叉堆 -> 正文阅读

[数据结构与算法]Python Tree 树 - BinaryTree 二叉树 - BinaryHeap 二叉堆

1. 树的基本结构

树是有n个节点的有限集。在任意的非空树中,树有且仅有一个特定的称为 根(root) 的节点,如节点 【0】。如果 n>1,其他的节点则可以分成 m 个互不相交的有限集,每一个都是一个树,是根的 子树,如下图的绿色区域。

以节点【3】为例,节点的上一级节点是 父节点(parent),如节点【1】。节点的下一级节点是 孩子节点(child),如节点【6】【7】。若有由同一个父节点衍生出来的节点,称为 兄弟节点(sibling),如节点【4】。节点【4】【5】【6】【7】是树的末端,没有孩子节点,称为 叶子节点(leaf)

树的最大层级数称为树的 高度或深度,如该树的高度为4。

在这里插入图片描述

2. 二叉树 Binary Tree

2.1. 二叉树基本结构

二叉树是树的一种,它的限制是一个节点最多有 2 个子节点。左边的子节点叫 left child,右边的子节点叫 right child

二叉树有两种特殊形态:

  1. 满二叉树:二叉树的所有非叶子节点都存在两个子节点,并且所有叶子节点在同一层级。
    满二叉树
  2. 完全二叉树:一个有 n 个结点的二叉树,按层级顺序进行编号,编号为 1 到 n。满足这个树所有节点和同样深度的满二叉树的同编号节点位置相同。
    完全二叉树

2.2. 二叉树存储结构

2.2.1. 链式存储

链式存储本质是是对单链表的变形。单链表每个节点具有 data 变量和 next 指针构成。二叉树中,我们增加了一个指针,每个节点除了 data 变量外,还有 left 和 right 两个指针分别指向左、右两个子节点。

2.2.2. 数组存储

数组存储,需要把二叉树的节点按 层级顺序 放到数组中。如果某一节点的左、右子节点出现空缺,那我们必须在数组存放时相应的位置也空出来。这样存放的目的是可以通过计算下标直接定位二叉树的子节点和父节点位置。(例:父节点下标为1,左子节点下标为 2 * 1 + 1 = 3,右子节点下标为 2*1 + 2 = 4)

2.3. 二叉树的遍历

二叉树的遍历可以归结为两大类:深度优先遍历和广度优先遍历。其中深度优先遍历包括前序遍历,中序遍历,后序遍历。广度优先遍历包括层序遍历。

构架二叉树

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

def create_binary_tree(input_list=[]):
	""" 构建二叉树 """
	if input_list is None or len(input_list) == 0:
		return None
	data = input_list.pop(0)
	if data is None:
		return None
	node = TreeNode(data)
	node.left = create_binary_tree(input_list)
	node.right = create_binary_tree(input_list)
	return node

2.3.1. 深度优先遍历

2.3.1.1. 前序遍历实现

遍历顺序:根节点,左子树,右子树
在这里插入图片描述

  1. 递归
def pre_order_traversal(node):
	""" 前序遍历 """
	if node is None:
		return
	print(node.data)
	pre_order_traversal(node.left)
	pre_order_traversal(node.right)
	return node
  1. 非递归(栈)
def pre_order_traversal_by_stack(node):
	""" 前序遍历 """
	stack = []
	while(node is not None or len(stack) > 0):
		while(node is not None):
			print(node.data)
			stack.append(node)
			node = node.left
		if len(stack)>0:
			node = stack.pop()
			node = node.right

2.3.1.2. 中序遍历实现

遍历顺序:左子树,根节点,右子树
在这里插入图片描述

  1. 递归
def in_order_traversal(node):
	""" 中序遍历 """
	if node is None:
		return
	in_order_traversal(node.left)
	print(node.data)
	in_order_traversal(node.right)
	return node 
  1. 非递归(栈)
def in_order_traversal_by_stack(node):
	""" 中序遍历 """
	stack = []
	while(node is not None or len(stack) > 0):
		while(node is not None):
			stack.append(node)
			node = node.left
		if len(stack)>0:
			node = stack.pop()
			print(node.data)
			node = node.right

2.3.1.3. 后序遍历实现

遍历顺序:左子树,右子树,根节点
在这里插入图片描述

  1. 递归
def post_order_traversal(node):
	""" 后序遍历 """
	if node is None:
		return
	post_order_traversal(node.left)
	post_order_traversal(node.right)
	print(node.data)
	return node 
  1. 非递归(栈)
def post_order_traversal_by_stack(node):
	""" 后序遍历 """
	stack = []
	parent = []
	while(node is not None or len(stack) > 0):
		while(node is not None):
			stack.append(node)
			node = node.left
		if len(stack)>0:
			node = stack.pop()
			if node.right is None:
				print(node.data)
				if len(parent) > 0:
					print(parent.pop().data)
			else:
				parent.append(node)
			node = node.right
	while(len(parent)>0):
		print(parent.pop().data)

2.3.2. 广度优先遍历

2.3.2.1. 层序遍历

遍历顺序:按照根节点到叶子节点的层次关系,一层一层横向遍历
在这里插入图片描述

  1. 递归
def level_order_traversal(node):
	""" 层序遍历 """
	# TODO
  1. 非递归(队列)
def level_order_traversal_by_queue(node):
	""" 层序遍历 """
	queue = Queue()
	queue.put(node)
	while(not queue.empty()):
		node = queue.get()
		print(node.data)
		if node.left is not None:
			queue.put(node.left)
		if node.right is not None:
			queue.put(node.right)

3. 二叉堆 Binary Heap

TODO

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 12:59:14  更:2021-07-30 13:02:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 20:42:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码