• 技术文章 >Python技术 >Python基础教程

    面向对象之深度优先和广度优先

    爱喝马黛茶的安东尼爱喝马黛茶的安东尼2019-07-05 10:30:58原创2699

    面向对象深度优先和广度优先是什么?

    zz.png

    x.png

    相关推荐:《Python视频教程

    c.png

    v.png

    二叉树的两种遍历是数据结构的经典考察题目, 广度遍历考察队列结构, 深度遍历考察递归

    1562293365(1).png

    深度优先

    1

    2

    3

    先序遍历(父, 左子, 右子) 0, 1, 3, 7, 8, 4, 9, 2, 5, 6

    中序遍历(左子, 父, 右子) 7, 3, 8, 1, 9, 4, 0, 5, 2, 6

    后序遍历(左子, 右子, 父) 7, 8, 3, 9, 4, 1, 5, 6, 2, 0

    "深度优先遍历"考察递归, 将子节点为空作为终止递归的条件

    相关推荐:《Python视频教程

    广度优先

    1

    "广度优先遍历"考察队列的结构, 消除父节点(出队列,顺便打印), 添加子节点(进队列),当队列内元素个数为零, 完成遍历

    添加元素

    1562293379(1).png

    广度优先遍历

    1562293393(1).png

    深度优先

    1562293411(1).png

    1562293424(1).png

    1562293440(1).png

    Python3 实现

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    87

    88

    89

    90

    91

    92

    93

    94

    95

    class Node(object):

        """初始化一个节点,需要为节点设置值"""

        def __init__(self, val):

            self.val = val

            self.left = None

            self.right = None

    class BinaryTree(object):

        """

        创建二叉树,完成

        - 添加元素

        - 广度遍历

        - 深度遍历(先序遍历, 中序遍历, 后序遍历)

        """

        def __init__(self):

            self.root = None

            pass

        # 添加元素

        def addNode(self, val):

            # 创建队列结构存储结点

            nodeStack = [self.root,]

            # 如果根结点为空

            if self.root == None:

                self.root = Node(val)

                print("添加根节点{0}成功!".format(self.root.val))

                return

            while len(nodeStack) > 0:

                # 队列元素出列

                p_node = nodeStack.pop()

                # 如果左子结点为空

                if p_node.left == None:

                    p_node.left = Node(val)

                    print("添加左:{0} ".format(p_node.left.val))

                    return

                # 如果右子节点为空

                if p_node.right == None:

                    p_node.right = Node(val)

                    print("添加右:{0} ".format(p_node.right.val))

                    return

                nodeStack.insert(0, p_node.left)

                nodeStack.insert(0, p_node.right)

        # 广度遍历(中序: 先读父节点,再读左子节点, 右子节点)

        def breadthFirst(self):

            nodeStack = [self.root, ];

            while len(nodeStack) > 0:

                my_node = nodeStack.pop()

                print("-->",my_node.val)

                if my_node.left is not None:

                    nodeStack.insert(0, my_node.left)

                if my_node.right is not None:

                    nodeStack.insert(0, my_node.right)

        # 深度优先(先序遍历)

        def preorder(self, start_node):

            if start_node == None:

                return

            print(start_node.val)

            self.preorder(start_node.left)

            self.preorder(start_node.right)

        # 深度优先(中序遍历)

        def inorder(self, start_node):

            if start_node == None:

                return

            self.inorder(start_node.left)

            print(start_node.val)

            self.inorder(start_node.right)

        # 深度优先(后序遍历)

        def outorder(self, start_node):

            if start_node == None:

                return

            self.outorder(start_node.left)

            self.outorder(start_node.right)

            print(start_node.val)

    def main():

        bt = BinaryTree()

        bt.addNode(0)

        bt.addNode(1)

        bt.addNode(2)

        bt.addNode(3)

        bt.addNode(4)

        bt.addNode(5)

        bt.addNode(6)

        bt.addNode(7)

        bt.addNode(8)

        bt.addNode(9)

        print("广度遍历-->")

        bt.breadthFirst()

         

        print("先序遍历-->")

        bt.preorder(bt.root)

        print("中序遍历-->")

        bt.inorder(bt.root)

         

        print("后序遍历-->")

        bt.outorder(bt.root)

    if __name__ == '__main__':

        main()

    专题推荐:面向对象 深度优先 广度优先
    上一篇:Python sleep函数用法:线程睡眠 下一篇:Python Timer定时器:控制函数在特定时间执行

    相关文章推荐

    • python面向对象编程详解• Python面向对象编程之组合关系• Python3 面向对象• Python之什么叫面向对象

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网