前面说到算法被虐了,这回我要好好把它啃下来。哪里跌倒就要从哪里站起来。这是我复习算法与数据结构时的小笔记,这里就 po 出来,给你们也复习一下旧的知识点,查缺补漏。若是个人文章对你有帮助,欢迎关注、点赞、转发,这样我会更有动力作原创分享。node
在计算器科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具备树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具备层次关系的集合。mysql
二叉树:每一个节点最多含有两个子树的树称为二叉树; 彻底二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层全部节点从左向右连续地紧密排列,这样的二叉树被称为彻底二叉树; 面试
满二叉树:全部叶节点都在最底层的彻底二叉树; 算法
深度优先遍历便是先按深度来遍历二叉树,包括:sql
前序遍历
遍历顺序 --> 根节点 -> 左子树 -> 右子树数据库
中序遍历
遍历顺序--> 左子树 -> 根节点 -> 右子树性能优化
后序遍历
遍历顺序--> 左子树 -> 右子树 -> 根节点bash
首先,定义 TreeNode:数据结构
class TreeNode:
def __init__(self, value=None, left=None, right=None):
self.value = value
self.left = left # 左子树
self.right = right # 右子树
复制代码
实例化一个 TreeNode:app
node1 = TreeNode("A",
TreeNode("B",
TreeNode("D"),
TreeNode("E")
),
TreeNode("C",
TreeNode("F"),
TreeNode("G")
)
)
复制代码
def preTraverse(root):
if root is None:
return
print(root.value)
preTraverse(root.left)
preTraverse(root.right)
复制代码
运行结果:
A
B
D
E
C
F
G
复制代码
def midTraverse(root):
if root is None:
return
midTraverse(root.left)
print(root.value)
midTraverse(root.right)
复制代码
运行结果:
D
B
E
A
F
C
G
复制代码
def afterTraverse(root):
if root is None:
return
afterTraverse(root.left)
afterTraverse(root.right)
print(root.value)
复制代码
运行结果:
D
E
B
F
G
C
A
复制代码
广度优先遍历便是层次遍历,按一层一层地遍历。
def levelOrder(root):
# write your code here
res = []
# 若是根节点为空,则返回空列表
if root is None:
return res
# 模拟一个队列储存节点
q = []
# 首先将根节点入队
q.append(root)
# 列表为空时,循环终止
while len(q) != 0:
length = len(q)
for i in range(length):
# 将同层节点依次出队
r = q.pop(0)
if r.left is not None:
# 非空左孩子入队
q.append(r.left)
if r.right is not None:
# 非空右孩子入队
q.append(r.right)
res.append(r.value)
print(r.value)
return res
复制代码
运行结果:
A
B
C
D
E
F
G
复制代码
此次复习先是到这里了。这里唠叨一下,数据结构与算很重要,不少东西的实现都少不了数据结构与算法,就如 mysql 的实现就用到了 B+ 树,若是咱们懂其中的原理,对数据库性能优化会有很大的帮助。还有一点比较重要的是,大厂的面试确定少不了算法与数据结构。想进大厂?仍是乖乖滴学通算法。
本篇文章首发于公众号「zone7」,关注公众号获取最新推文,后台回复【国庆指数】获取源码。