二叉树

一、结构

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张图片

在输出遍历结果时,据父结点值相对于子结点输出顺序的不同,深度优先遍历又可细分为先序、中序、后序遍历三种情况

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)

按照结点深度逐层遍历树结构

二叉树_第2张图片

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)结构完成操作,具体的出入队列

二叉树_第3张图片

 

 

你可能感兴趣的:(二叉树)