树
我们已经学了三个结构了,链表、栈、队列,但是它们都是线性结构,很难使用它们组织对象的分层表示。为了避免这种限制,我们创建了树这个结构。
树由节点和弧组成,与自然界的树不同的是,我们所说的树是倒着的:根在上,叶子结点在下。根没有父节点只有子节点,叶节点没有子节点或者子节点是空结构。
在一棵树中,每个节点都可以经都可以从根节点经一个唯一的弧序列到达,此弧序列被称为路径,路径中弧的数量称为路径的长度。节点的层次是从根节点到该节点的路径的长度加一,也就是该路径上节点的数量。非空树的高度是树中节点的最大层次。空树的高度是0,单节点是高度为一的树。极端的情况下,树会退化成链表。
二叉树
二叉树是节点可以包含两个子节点(也可以为空)的树,每一个子节点都区分做子节点或右子节点。二叉树的一个重要性质就是其叶节点的数量,该性质在评价排序算法的期望效率的时候会用到。
二叉树的基本实现
1、插入节点
2、寻找节点
3、二叉树的遍历:广度优先遍历、深度优先遍历(递归、非递归)
想必看过我们之前的文章的同学们都知道,广度优先搜索和深度优先搜索都单独写了一篇文章来介绍,不过在这里的话,我们就不能说的这么详细了,看完本文还有疑惑的小伙伴可以在基础算法篇中看一下具体的搜索算法
二叉树的python实现
class node:
"""
节点类,包含data存储信息
left指向左节点
right指向右节点
"""
def __init__(self, data, left = None, right = None):
self.data = data
self.right = right
self.left = left
class tree:
def __init__(self):
#根节点初始化为None
self.root = None
def Insert(self, data):
#插入操作
if self.root == None:
self.root =node(data)
else:
p = self.root
while True:
if data < p.data:
if p.left == None:
p.left = node(data)
break
else:
p = p.left
continue
else:
if p.right == None:
p.right = node(data)
break
else:
p = p.right
continue
def Find(self, data):
#按数据寻找
p = self.root
sstack = [p]
while sstack:
p = sstack.pop(0)
if p.data == data : return 1
if p.left : sstack.append(p.left)
if p.right : sstack.append(p.right)
return -1
def BFS(self):
#广度优先搜索
p = self.root
queue = [p]
while queue:
p = queue.pop(0)
print(p.data)
if p.left : queue.append(p.left)
if p.right : queue.append(p.right)
def DFS(self):
#深度优先搜索
p = self.root
sstack = [p]
while sstack:
p = sstack.pop(-1)
print(p.data)
if p.right : sstack.append(p.right)
if p.left : sstack.append(p.left)
def VLR(self,node):
#前序遍历
if node:
print(node.data)
self.dfs(node.left)
self.dfs(node.right)
欢迎关注公众号 : 数学算法实验室
算法与人工智能