zoukankan      html  css  js  c++  java
  • Python数据结构之二叉树

    本来打算一个学期分别用C++、Python、Java实现数据结构,看来要提前了

    这个是Python版本,我写的数据结构尽量保持灵活性,本文bt1是一般的插入法建立二叉树结构,bt2就是可以任意输入,至于树的高度的递归和非递归实现等等,在C++里实现过就不再重复。

    #Date     : 2013-9-12
    #Author   : DVD0423
    #Function : 二叉树
    
    class Node:
        def __init__(self, value = None, left = None, right = None):
            self.value = value
            self.left = left
            self.right = right
        def visit(self):
            print(self.value)
            
    class BTree:
        def __init__(self, root = Node()):
            self.root = root
    
        def CreateBTree(self, _list = []):
            #层序遍历,产生二叉树结构
            length = len(_list)
            node = []  
            for i in range(length):
                node.append(Node())
                node[i].value = _list[i]               
            front = 0
            rear = 0
            while(rear != length):
                rear = rear + 1
                if rear >= length:
                    break
                node[front].left = node[rear]
                rear = rear + 1
                if rear >= length:
                    break
                node[front].right = node[rear]
                front = front + 1
            #下面这句没有必要,因为初始化就是None,但是逻辑上要有
            while(front != length):
                node[front].left = None
                node[front].right = None
                front = front + 1    
            self.root = node[0]
            
        def Traverse(self, method):
            def PostOrder(node):
                
                if node:
                    PostOrder(node.left)
                    PostOrder(node.right)
                    node.visit()
    
            def InOrder(node):
                if node:
                    InOrder(node.left)
                    node.visit()
                    InOrder(node.right)
    
            def PreOrder(node):
                if node:
                    node.visit()
                    PreOrder(node.left)
                    PreOrder(node.right)
    
            def NoRecTraverse(node):
                ls = []
                while True:
                    if node:
                        ls.append(node)
                        node.visit()
                        node = node.left
                    else:
                        if len(ls) != 0:
                            node = ls.pop()
                        node = node.right
                        if len(ls) == 0 and node == None:
                            break
                        
            if method is 1:
                print("后序遍历")
                PostOrder(self.root)
            elif method is 2:
                print("中序遍历")
                InOrder(self.root)
            elif method is 3:
                print("前序遍历")
                PreOrder(self.root)
            else:
                print("非递归先序遍历")
                NoRecTraverse(self.root)
    def InputInt():
        seq = []  
        while True:  
            ch = input()  
            if ch is 'e':  
                break  
            seq.append(int(ch))
        return seq    
        
    if __name__ == '__main__':
        #两种方式建立二叉树
        print("二叉树1:")
        node3 = Node(3)
        node2 = Node(2)
        node1 = Node(1, node2, node3)
        bt1 = BTree(node1)
        bt1.Traverse(4)
    
        print("二叉树2:")
        ls = InputInt() 
        bt2 = BTree()
        bt2.CreateBTree(ls)
        bt2.Traverse(4)
        
        


     

  • 相关阅读:
    php.h: No such file or directory
    检查日期是否为节假日api
    Linux下实现秒级的crontab定时任务
    Apache 两种mpm prefork 和 worker 的区别
    centos6 安装mysql报错Requires: libc.so.6(GLIBC_2.14)
    Yii2 高级模板添加更多Application
    Yii2 assets注册的css样式文件没有加载
    Yii rbac原理和实践
    Yii2 ActiveRecord save失败
    Yii2 手动安装yii2-imagine插件
  • 原文地址:https://www.cnblogs.com/pangblog/p/3320086.html
Copyright © 2011-2022 走看看