二叉树的深度优先遍历策略详解

1.算法思想

深度优先往往可以很快找到搜索路径,比如先找一个结点看看是不是终点,若不是继续往深层去找,直到找到终点。分为中序,先序,后序三种深度优先算法。

2. 操作过程

1) 先序遍历的操作过程如下:

  • 若二叉树为空, 则什么都不做 ; 
  • 若二叉树非空(根 左 右): 

①访问根节点; ② 先序遍历左子树; ③ 先序遍历右子树.

2) 中序遍历的操作过程如下:

  • 若二叉树为空, 则什么都不做 ; 
  • 若二叉树非空(左 根 右): 

①中序遍历左子树; ② 访问根节点; ③ 中序遍历右子树.

3) 后序遍历的操作过程如下:

  • 若二叉树为空, 则什么都不做 ; 
  • 若二叉树非空(左 右 根): 

①后序遍历左子树; ② 后序遍历右子树;  ③访问根节点.

二叉树的深度优先遍历策略详解_第1张图片

3.代码实现

# 2.4 遍历, 深度优先 => 前序, 即:  根, 左, 右
    def preorder_travle(self, root):    # root表示节点
        # 1. 判断根节点是否不为空, 不为空, 就按照 根,左,右 顺序逐个获取.
        if root is not None:
            # 2. 根
            print(root.item, end = ' ')
            # 3. 左, 递归获取.
            self.preorder_travle(root.lchild)
            # 4. 右, 递归获取.
            self.preorder_travle(root.rchild)

    # 2.5 遍历, 深度优先 => 中序, 即:  左, 根, 右
    def inorder_travle(self, root):    # root表示节点
        # 1. 判断根节点是否不为空, 不为空, 就按照 左, 根, 右 顺序逐个获取.
        if root is not None:
            # 2. 左, 递归获取.
            self.inorder_travle(root.lchild)
            # 3. 根
            print(root.item, end = ' ')
            # 4. 右, 递归获取.
            self.inorder_travle(root.rchild)

    # 2.6 遍历, 深度优先 => 后序, 即:  左, 右, 根
    def postorder_travle(self, root):    # root表示节点
        # 1. 判断根节点是否不为空, 不为空, 就按照 左, 右, 根 顺序逐个获取.
        if root is not None:
            # 2. 左, 递归获取.
            self.postorder_travle(root.lchild)
            # 3. 右, 递归获取.
            self.postorder_travle(root.rchild)
            # 4. 根
            print(root.item, end = ' ')

你可能感兴趣的:(深度优先,算法)