zoukankan      html  css  js  c++  java
  • 数据结构-python-二叉树

    二叉树

    顾名思义,二叉树就是只有两个节点的树,两个节点分别为左节点和右节点,特别强调,即使只有一个子节点也要区分它是左节点还是右节点。

    常见的二叉树有一般二叉树、完全二叉树、满二叉树、线索二叉树、霍夫曼树、二叉排序树、平衡二叉树、红黑树、B树这么多种类。我们这篇文章中简单介绍一般二叉树、完全二叉树和满二叉树。

    一般二叉树

    很简单,只要满足子节点数不超过两个的树就是一棵二叉树。长这样:

    二叉树

    满二叉树

    满二叉树在一般二叉树的基础上要求除了最后一层的节点之外,每一个节点都必须有两个子节点。

    满二叉树

    完全二叉树

    完全二叉树要求从第一层到倒数第二层组成的树是一颗满二叉树,最后一层的节点要满足从左往右排列。

    完全二叉树

    好,关于二叉树的概念,我们就介绍到这里,下面我们来介绍二叉树的前序、中序、后序遍历。

    在此之前呢,我们先创建一颗二叉树:

    class BinaryTree:
        def __init__(self, data):
            self.data = data
            self.left = None
            self.right = None
    
        def get(self):
            return self.data
    
        def getLeft(self):
            return self.left
    
        def getRight(self):
            return self.right
    
        def setLeft(self, node):
            self.left = node
    
        def setRight(self, node):
            self.right = node

    好,这里我们定义好了一个二叉树类,并给它添加了一下方法,然后我们来实例化一颗二叉树:

    binaryTree = BinaryTree(0)
    binaryTree.setLeft(BinaryTree(1))
    binaryTree.setRight(BinaryTree(2))
    binaryTree.getLeft().setLeft(BinaryTree(3))
    binaryTree.getLeft().setRight(BinaryTree(4))
    binaryTree.getRight().setLeft(BinaryTree(5))
    binaryTree.getRight().setRight(BinaryTree(6))

    实例化好的二叉树是长这个样子的:

    前序遍历

    接下来,我们对这棵树进行前序遍历。在此之前,我们介绍一下什么是前序遍历。

    前面我们介绍过了树的深度优先遍历和广度优先遍历,这里就不再赘述了。

    前序遍历的顺序就是先遍历树的父节点,然后遍历树的左节点,然后遍历树的右节点,以此类推。

    对于我们上面定义好的二叉树来说,它的前序遍历结果就是:0 -> 1 -> 3 -> 4 -> 2 -> 5 -> 6

    对于前序、中序、后序遍历来说,采用递归的方式是非常方便的。这里我们就用递归来实现一下:

    def preorderTraversal(now, result=[]):
        if now == None:
            return result
        result.append(now.data)
        preorderTraversal(now.left, result)
        preorderTraversal(now.right, result)
        return result
    
    
    print(preorderTraversal(binaryTree))

    执行结果:[0, 1, 3, 4, 2, 5, 6],是不是和我们之前手动遍历的结果一样呢。

    中序遍历

    中序遍历的顺序是:先遍历树的左节点,再遍历树的父节点,再遍历树的右节点。

    对于我们上面创建的二叉树,它的中序遍历结果就是:3 -> 1 -> 4 -> 0 -> 5 -> 2 -> 6

    在前序遍历的时候是先遍历父节点,所以result.append(now.data),就在遍历左节点和右节点的前面。

    而中序遍历要先遍历左节点,所以result.append(now.data)就要在遍历左节点的后面,遍历右节点的前面。

    def intermediateTraversal(now, result=[]):
        if now == None:
            return result
        intermediateTraversal(now.left, result)
        result.append(now.data)
        intermediateTraversal(now.right, result)
        return result
    
    
    print(intermediateTraversal(binaryTree))

    执行结果:[3, 1, 4, 0, 5, 2, 6]

    后序遍历

    后序遍历顺序是:先遍历树的左节点,再遍历树的右节点,再遍历树的父节点。

    对于我们上面创建的二叉树,它的后序遍历结果是:3 -> 4 -> 1 -> 5 -> 6 -> 2 -> 0

    相应的递归方程为:

    def postorderTraversal(now, result=[]):
        if now == None:
            return
        postorderTraversal(now.left, result)
        postorderTraversal(now.right, result)
        result.append(now.data)
        return result
    
    print(postorderTraversal(binaryTree))

    执行结果:[3, 4, 1, 5, 6, 2, 0]

    数据来源:https://www.cnblogs.com/dongyangblog/p/11210820.html

    二叉搜索树

    #先中序遍历,然后检测结果是否是升序
    import copy
    def is_increasing(a):
        b = copy.copy(a)
        a.sort()
        if a == b:
            return True
        else:
            return False
    a = intermediateTraversal(binaryTree)
    is_increasing(a)

    作者:陈耿聪 —— 夕狱

    出处:https://www.cnblogs.com/CGCong/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    暂存。2
    暂存。
    dom兼容性问题3 元素操作
    一个查看Access数据库密码的工具
    解除IIS配置节锁定
    解决cef中title不现实tooltip的问题
    创建.symlnk文件
    查询orcale运行的SQL语句记录
    跨域http头
    C#抓取天气数据
  • 原文地址:https://www.cnblogs.com/CGCong/p/14647812.html
Copyright © 2011-2022 走看看