• 二叉树


    一、二叉树

    二叉树是一种特殊的树,其特点如下:

    1. 二叉树每个节点最大只能有两个节点。
    2. 二叉树的子树也就是节点有左右之分,即左节点和右节点,次序不能乱。
    3. 二叉树即使只有一个子树,也有左右之分。

    二、满二叉树

    一种特殊的二叉树,其所有的分支节点都有两棵树,其所有的叶子节点都在同一层内。

    1. 所有的叶子节点都在同一层。
    2. 所有的非叶子节点都有两棵树,即节点度都是2.
    3. 同样深度的二叉树中,满二叉树的节点最多,2的h次方减1,其中 h为树的深度。

    三、完全二叉树

    若设二叉树的深度为 h ,除第 h层外,其它各层 (1h1)(1~h−1) 的结点数都达到最大个数,第 hh 层所有的结点都连续集中在最左边,这就是完全二叉树。其具有以下特点:

    1. 叶子节点可以出现在最后一层或倒数第二层。
    2. 最后一层的叶子节点一定集中在左部连续位置。
    3. 完全二叉树严格按层序编号。(可利用数组或列表进行实现,满二叉树同)
    4. 若一个节点为叶子节点,那么编号比其大的节点均为叶子节点。

    四、创建节点

    class Node(object):
    
        def __init__(self, data, left=None, right=None):
            self.data = data
            self.left = left
            self.right = right

    五、根据列表创建二叉树

    class Node(object):
    
        def __init__(self, data, left=None, right=None):
            self.data = data
            self.left = left
            self.right = right
    
    
    class BinTreeNode(object):
    
        def __init__(self):
            self.root = None
    
        def create(self, li):
            for i in li:
                self.insert(i)
    
        def insert(self,num):
            if self.root == None:
                self.root = Node(num)
            else:
                p = self.root
                while 1:
                    if num < p.data:
                        if p.left:
                            p = p.left  #递归创建
                        else:
                            p.left = Node(num)
                            break
                    elif num > p.data:
                        if p.right:
                            p = p.right  # 递归创建
                        else:
                            p.right = Node(num)
                            break
    
    
    if __name__ == "__main__":
        tree = BinTreeNode()
        li = [5, 1, 3, 8, 2, 9, 4, 6, 7]
        tree.create(li)

    六、前序遍历

    先访问根节点,再先序遍历左子树,然后再先序遍历右子树。总的来说是根、左、右。

    def proNode(root):
        if root:
            print(root.data, end=' ')
            proNode(root.left)
            proNode(root.right)

    七,中序遍历

    先中序访问左子树,然后访问根,最后中序访问右子树。总的来说是左、根、右。

    def proNode(root):
        if root:
            proNode(root.left)
            print(root.data, end=' ')
            proNode(root.right)

    八、后续遍历

    先后序访问左子树,然后后序访问右子树,最后访问根。总的来说是左、右、根。

    def proNode(root):
        if root:
            proNode(root.left)
            proNode(root.right)
            print(root.data, end=' ')

     九、宽度优先遍历——层次遍历

    利用队列,依次将根,左子树,右子树存入队列,按照队列的先进先出规则来实现层次遍历。

    def bfs(root):
        if root ==None:
            return
        queue = []
        queue.append(root)
    
        while queue:
            curNode = queue.pop(0)
            print(curNode.data, end=' ')
            if curNode.left:
                queue.append(curNode.left)
    
            if curNode.right:
                queue.append(curNode.right)

    十、深度优先

    利用栈,先将根入栈,再将根出栈,并将根的右子树,左子树存入栈,按照栈的先进后出规则来实现深度优先遍历。

    前序、中序、后续遍历都属于深度优先遍历。

    下面代码即是不用递归实现的前序遍历。

    def dfs(root):
        if root == None:
            return
    
        infoqueue = []
        infoqueue.append(root)
    
        while infoqueue:
            curNode = infoqueue.pop()
            print(curNode.data, end=' ')
            if curNode.right:
                infoqueue.append(curNode.right)
            if curNode.left:
                infoqueue.append(curNode.left)

    结束!

  • 相关阅读:
    LVS安装配置
    Ansible自动化运维工具的使用
    DHCP中继配置
    简单爬虫
    zlib1.2.8 编译小记
    varnish 4.0编译安装小记
    imdisk命令行使用及配置
    How to say all the keyboard symbols in English and Chinese
    qwt6在Windows下Qt5的编译,安装,初步使用
    4MLinux7.0 服务器配置详解 别名TheSSS
  • 原文地址:https://www.cnblogs.com/aaronthon/p/13658721.html
Copyright © 2020-2023  润新知