数据结构:
线性表:
底层是由顺序表和链表决定的。
顺序表:
连续内存
列表 (分离式动态顺序表)
链 表:
单向链表
单向循环链表:尾连头
双向链表
双向循环链表:尾连头
栈:
概念:
栈 (Stack) 是限制插入和删除操作只能在一个位置进行的表,该位置是表的末端,称为栈的顶 (top)。栈的基本操作有PUSH (入栈) 和POP (出栈)。栈又被称为(FILO):
顺序栈:
底层基于顺序表操作
链 栈:
底层基于链表操作
先进后出(弹夹原理)
class Stack():
def __init__(self):
self.stack = []
# 入栈
def push(self, item):
self.stack.append(item)
# 出栈
def pop(self):
# 如果栈内元素为空
if self.isEmpty():
# 抛出异常
raise ValueError("stack is empty")
else:
self.stack.pop()
# 栈空
def isEmpty(self):
return self.size() == 0
# 栈内元素个数
def size(self):
return len(self.stack)
# 栈顶元素
def peep(self):
if self.isEmpty():
raise ValueError("stack is empty")
else:
return self.stack[-1]
队列:
队列机制:先进先出(队尾进,队头出)
概念:
队列(queue)也是表,使用队列时插入和删除在不同的端进行。队列的
基本操作是Enqueue(入队),在表的末端(rear)插入一个元素,还有
出列(Dequeue),删除表开头的元素。又被称为(FIFO)
顺序队:
链 队:
class Queue():
def __init__(self):
self.queue = []
def enqueue(self, item):
self.queue.append(item)
def dequeue(self):
if self.is_empty():
raise IndexError("queue is empty")
else:
return self.queue.pop()
def qsize(self):
return len(self.queue)
def is_empty(self):
return self.qsize() == 0
树 :
概念:
是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。
把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;
每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树
树的种类:
无序树:
树中任意节点的子节点之间没有顺序关系,这种树称为无序树,
也称为自由树;
有序树:
树中任意节点的子节点之间有顺序关系,这种树称为有序树;
二叉树:
每个节点最多含有两个子树的树称为二叉树;
完全二叉树:
对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树,其中满二叉树的定义是所有叶节点都在最底层的完全二叉树;
平衡二叉树(AVL树):
当且仅当任何节点的两棵子树的高度差不大于1的二叉树;
排序二叉树(二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树);
霍夫曼树(用于信息编码):
带权路径最短的二叉树称为哈夫曼树或最优二叉树;
B树:
一种对读写操作进行优化的自平衡的二叉查找树,能够保持数据有序,拥有多余两个子树。
二叉树的遍历:
广度优先:
层序遍历
从树的root开始,从上到下从从左到右遍历整个树的节点
深度优先:
先序遍历
在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树。
根节点->左子树->右子树
中序遍历
在中序遍历中,我们递归使用中序遍历访问左子树,然后访问根节点。最后,再递归使用中序遍历访问右子树。
左子树->根节点->右子树
后续遍历
在后续遍历中,我们先递归使用后续遍历访问左子树和右子树,最后访问根节点。
左子树->右子树->根节点