zoukankan      html  css  js  c++  java
  • 二叉树

    Python & BinaryTree

    1. BinaryTree (二叉树)

    二叉树是有限个元素的集合,该集合或者为空、或者有一个称为根节点(root)的元素及两个互不相交的、分别被称为左子树和右子树的二叉树组成。

    • 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
    • 二叉树的第i层至多有2^{i-1}个结点
    • 深度为k的二叉树至多有2^k-1个结点;
    • 对任何一棵二叉树T,如果其终端结点数为N0,度为2的结点数为N2,则N0=N2+1

    2:二叉树遍历图解说明

    前序遍历:根-左-右

     

     中序遍历:左-根-右 

     后序遍历:左-右-根 

    3. 二叉树

    这里写图片描述

    • 生成二叉树
    # init a tree
    def InitBinaryTree(dataSource, length):
        root = BTNode(dataSource[0])
    
        for x in xrange(1,length):
            node = BTNode(dataSource[x])
            InsertElementBinaryTree(root, node)
        return root
        print 'Done...'
    • 前根遍历
    # pre-order
    def PreorderTraversalBinaryTree(root):
        if root:
            print '%d | ' % root.data,
            PreorderTraversalBinaryTree(root.leftChild)
            PreorderTraversalBinaryTree(root.rightChild)
    • 中根遍历
    # in-order
    def InorderTraversalBinaryTree(root):
        if root:
            InorderTraversalBinaryTree(root.leftChild)
            print '%d | ' % root.data,
            InorderTraversalBinaryTree(root.rightChild)
    • 后根遍历
    # post-order
    def PostorderTraversalBinaryTree(root):
        if root:
            PostorderTraversalBinaryTree(root.leftChild)
            PostorderTraversalBinaryTree(root.rightChild)
            print '%d | ' % root.data,
    • 按层遍历
    # layer-order
    def TraversalByLayer(root, length):
        stack = []
        stack.append(root)
        for x in xrange(length):
            node = stack[x]
            print '%d | ' % node.data,
            if node.leftChild:
                stack.append(node.leftChild)
            if node.rightChild:
                stack.append(node.rightChild)

    这里写图片描述

    ---------------------------------------------------二叉树树的思想重在“递归”, 并不是非要用递归处理,而是去理解二叉树递归的思想------------------------------------------------------------

    • 完整代码段
    # -*- coding:utf-8 -*-
    
    #################
    ### implement Binary Tree using python
    ### Hongwing
    ### 2016-9-4
    #################
    
    import math
    
    class BTNode(object):
        """docstring for BTNode"""
        def __init__(self, data):
            self.data = data
            self.leftChild = None
            self.rightChild = None
    
    
    # insert element 
    def InsertElementBinaryTree(root, node):
        if root:
            if node.data < root.data:
                if root.leftChild:
                    InsertElementBinaryTree(root.leftChild, node)
                else:
                    root.leftChild = node
            else:
                if root.rightChild:
                    InsertElementBinaryTree(root.rightChild, node)
                else:
                    root.rightChild = node
        else:
            return 0
    
    # init a tree
    def InitBinaryTree(dataSource, length):
        root = BTNode(dataSource[0])
    
        for x in xrange(1,length):
            node = BTNode(dataSource[x])
            InsertElementBinaryTree(root, node)
        return root
        print 'Done...'
    
    # pre-order
    def PreorderTraversalBinaryTree(root):
        if root:
            print '%d | ' % root.data,
            PreorderTraversalBinaryTree(root.leftChild)
            PreorderTraversalBinaryTree(root.rightChild)
    
    # in-order
    def InorderTraversalBinaryTree(root):
        if root:
            InorderTraversalBinaryTree(root.leftChild)
            print '%d | ' % root.data,
            InorderTraversalBinaryTree(root.rightChild)
    
    # post-order
    def PostorderTraversalBinaryTree(root):
        if root:
            PostorderTraversalBinaryTree(root.leftChild)
            PostorderTraversalBinaryTree(root.rightChild)
            print '%d | ' % root.data,
    
    # layer-order
    def TraversalByLayer(root, length):
        stack = []
        stack.append(root)
        for x in xrange(length):
            node = stack[x]
            print '%d | ' % node.data,
            if node.leftChild:
                stack.append(node.leftChild)
            if node.rightChild:
                stack.append(node.rightChild)
    
    
    if __name__ == '__main__':
        dataSource = [3, 4, 2, 6, 7, 1, 8, 5]
        length = len(dataSource)
        BTree = InitBinaryTree(dataSource, length)
        print '****NLR:'
        PreorderTraversalBinaryTree(BTree)
        print '
    ****LNR'
        InorderTraversalBinaryTree(BTree)
        print '
    ****LRN'
        PostorderTraversalBinaryTree(BTree)
        print '
    ****LayerTraversal'
        TraversalByLayer(BTree, length)


    --------------------------------------------------------------------------------------------------------------------------------------------------------

    简单实现二叉树2(详细代码:https://github.com/201315060025/test/tree/master/data_structure_example)
    #二叉树的节点
    class Node(object):
        def __init__(self,data=None,l_child=None, r_child=None):
            self.data = data
            self.l_child = l_child
            self.r_child = r_child
    
    class B_Tree(object):
        def __init__(self, node=None):
            self.root = node
            
        def add(self, item=None):
            node = Node(item)
            #如果是空树,则直接添到根
            if not self.root:
                self.root = node
            else:
            #不为空,则按照 左右顺序 添加节点,这样构建出来的是一棵有序二叉树,且是完全二叉树
                my_queue = []
                my_queue.append(self.root)
                while True:
                    cur_node = my_queue.pop(0)
                    if not cur_node.l_child:
                        cur_node.l_child = node
                        return
                    elif not cur_node.r_child:
                        cur_node.r_child = node
                        return
                    else:
                        my_queue.append(cur_node.l_child)
                        my_queue.append(cur_node.r_child)
      

    if __name__ == __main__:
      data_list = [2,1,3,5,4.6]
      tree =
    B_Tree()
    for dt in data_list:
    tree.add(dt)
    
    
     
  • 相关阅读:
    近来几个有用的网站
    军事视频网站
    美军武器命名
    区块链的五个关键要素
    处理多媒体的两个重要工具
    Python re模块将字符串分割为列表
    Python 自动刷新网页
    selenium:chromedriver与chrome版本的对应关系
    怎么批量删除QQ空间说说?
    ssm获取数据库名称
  • 原文地址:https://www.cnblogs.com/zknublx/p/5874329.html
Copyright © 2011-2022 走看看