zoukankan      html  css  js  c++  java
  • python实现二叉树

    1.二叉树

    • 关于树实际是编程中遇到数据结构,根节点之外每个节点都有一个父节点,根节点没有父节点,除叶子节点之外所有节点都有一个或是多个子叶子节点,父节点何子节点之间通过指针连接(Go/Java有指针的概念,简单说指针就是地址)

    • 二叉树排序方式

      • 广度遍历(层次遍历)
        • 广度优先按照层次,一层一层遍历
      • 深度遍历
        • 前序:根左右(把跟放到最前面)
        • 中序:左根右(把根放到中间)
        • 后序:左右根(把根放到最后)

    2.排序二叉树

    • 代码实现:
    class Node():
        """封装节点对象"""
        def __init__(self,item):
            self.item = item
            self.left = None
            self.right = None
    
    class Tree():
        def __init__(self):
            # 构造出一颗空的二叉树
            # root要指向第一个节点的地址,如果root指向了None,则意味着该二叉树为空
            self.root = None
        def insert(self,item):
            node = Node(item)
            cur = self.root
            if cur is None:
                self.root = node
                return
            while True:
                # 这里用while循环判断根,左,右节点是否为None逐级插入数据
                if item < cur.item:
                    if cur.left is None:
                        cur.left = node
                        return
                    else:
                        cur = cur.left
                else:
                    if cur.right is None:
                        cur.right = node
                        return
                    else:
                        cur = cur.right
        def pre_sequence(self,root):
            #前序
            if root is None:
                return
            print(root.item,end = " ")
            self.pre_sequence(root.left)
            self.pre_sequence(root.right)
        def middle_sequence(self,root):
            #中序
            if root is None:
                return
            self.middle_sequence(root.left)
            print(root.item, end=" ")
            self.middle_sequence(root.right)
        def back_sequence(self,root):
            #后续
            if root is None:
                return
            self.back_sequence(root.left)
            self.back_sequence(root.right)
            print(root.item,end=" ")
            def travel(self,root):
            if root == None:
                return
            cur = root
            # 队列先进先出
            queue = [cur,]
            while queue:
                # 循环,pop,获取pop节点,左右子节点,不为None,加入队列继续循环
                n = queue.pop(0)
                print(n.item, end = " ")
                if n.left != None:
                    queue.append(n.left)
                if n.right != None:
                    queue.append(n.right)
    tree = Tree()
    tree.insert(3)
    tree.insert(8)
    tree.insert(5)
    tree.insert(7)
    tree.insert(6)
    
    tree.pre_sequence(tree.root)#
    print("
    ")
    tree.middle_sequence(tree.root)
    print("
    ")
    tree.back_sequence(tree.root)
    print("
    ")
    tree.travel(tree.root)
    """
    打印结果:
    前序:3 8 5 7 6 
    
    中序:3 5 6 7 8 
    
    后续:6 7 5 8 3
    
    广度:3 8 5 7 6
    """
    
    • 在执行insert方法时最终构建二叉树如下图:

  • 相关阅读:
    Android应用性能测试之CPU和内存占用
    每天一个linux命令(30): chown命令
    安装apk时出现错误Failure [INSTALL_FAILED_DEXOPT]问题解决的方法
    android adb shell 命令大全
    adb logcat命令查看并过滤android输出log
    Ubuntu里字符编码设置
    linux下GBK->UTF-8文件编码批量转换脚本
    Android开发之如何保证Service不被杀掉(broadcast+system/app)
    android的m、mm、mmm编译命令的使用
    解决 samba不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接
  • 原文地址:https://www.cnblogs.com/xujunkai/p/12341211.html
Copyright © 2011-2022 走看看