一、结构
1、树(Tree):是以边(edge)相连的节点(node)的集合,每个结点存储对应的值(value/data),当存在子结点时与之相连
2、根节点(root):是树的首个结点,在相连两结点中更接近根结点的成为父结点(parent node),相应的另一个结点称为子结点
3、边(edge):所有结点都由边相连,用于标识结点间的关系。边是用来确定结点之间的关系
4、叶子结点(leaves):树的末端结点
5、树高(height):是由根结点出发,到子结点的最长路径长度
6、结点深度(depth):是指对应结点到根结点路径的长度
二、二叉树
1、特殊的树结构:二叉树(binary tree),它每个结点最多有2个子结点
2、动手写二叉树,要实现的对象是一个结点集合,每个结点有三个属性:值(value)、左孩子(left_child)、右孩子(right_child)
class BinaryTree:
def __init__(self, value):
self.value = value
self.left_child = None
self.right_child = None
三、树的遍历
a)深度优先遍历(DFS):沿着特定路径遍历到根结点,再转换临近路径继续遍历
b)广度优先遍历(BFS):逐层遍历整个树结构
1、深度优先遍历(DFS)
在输出遍历结果时,据父结点值相对于子结点输出顺序的不同,深度优先遍历又可细分为先序、中序、后序遍历三种情况
1)先序遍历
即直接按照我们对结点的访问顺序输出遍历结果即实现,父结点值被最先术后出
def pre_order(self):
print(self.value)
if self.left_child:
self.left_child.pre_order()
if self.right_child:
self.right_child.pre_ordr()
2)中序遍历
以上图为例,中序遍历输出结果为3-2-4-1-6-5-7
左孩子值最先输出,然后是父结点,最后是右孩子
def in_oder(self):
if self.left_child:
self.left_child.in_order()
print(self.value)
if self.right_child:
self.right_child.in_order
3)后序遍历
以上图为例,后序遍历输出结果为3-4-2-6-7-5-1
左右孩子值依次输出,最后是父结点
def post_order(self):
if self.left_child:
self.left_child.post_order()
if sef.right_child:
self.right_child.post_order()
print(self.value)
2)广度优先遍历(BFS)
按照结点深度逐层遍历树结构
def bfs(self):
gueue = Queue()
queue.put(slef)
while not queue.empty():
current_node = queue.get()
print(current_node.value)
if current_node.left_child:
queue.put(current_node.left_child)
if current_node.right_child:
queue.put(current_node.right_child)
我们要借助先进先出(FIFO)的队列(queue)结构完成操作,具体的出入队列