活捉一颗野生二叉树
阅读本文大约需要 6 分钟
前面说到算法被虐了,这回我要好好把它啃下来。哪里跌倒就要从哪里站起来。这是我复习算法与数据结构时的小笔记,这里就 po 出来,给大家也复习一下旧的知识点,查缺补漏。如果我的文章对你有帮助,欢迎关注、点赞、转发。
一棵树
在计算器科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。
二叉树:每个节点最多含有两个子树的树称为二叉树; 完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树;
完全二叉树
满二叉树:所有叶节点都在最底层的完全二叉树;
满二叉树
深度优先遍历即是先按深度来遍历二叉树,包括:
前序遍历 遍历顺序 --> 根节点 -> 左子树 -> 右子树 中序遍历 遍历顺序--> 左子树 -> 根节点 -> 右子树 后序遍历 遍历顺序--> 左子树 -> 右子树 -> 根节点
首先,定义 TreeNode:
class TreeNode:
def __init__(self, value=None, left=None, right=None):
self.value = value
self.left = left # 左子树
self.right = right # 右子树
实例化一个 TreeNode:
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):
# 如果根节点为空,则返回空列表
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)
print(r.value)
运行结果:
A
B
C
D
E
F
G
转载声明:本文转载自「zone7」,搜索「zone7py」即可关注。
这次复习先是到这里了。这里唠叨一下,数据结构与算很重要,很多东西的实现都少不了数据结构与算法,就如 mysql 的实现就用到了 B+ 树,如果我们懂其中的原理,对数据库性能优化会有很大的帮助。还有一点比较重要的是,大厂的面试肯定少不了算法与数据结构。想进大厂?还是乖乖滴学通算法。