• 二叉树的python实现


      1 '''
      2 Created on 2016/12/26
      3 Created by freeol.cn
      4 一些排序算法的Python实现
      5 @author: 拽拽绅士
      6 '''
      7 
      8 import sys
      9 from _ast import While
     10 from celery.bin.celery import result
     11 
     12 '''顺序存储的二叉树实现(非完全存储)'''
     13 class node1(object):
     14     def __init__(self, S, L, R, V):
     15         self.S = S#
     16         self.L = L#左子
     17         self.R = R#右子
     18         self.V = V#
     19 class tree1(object):
     20     def createTree(self, a):
     21         data = []
     22         for n in a:
     23             data.append(node1(n[0], n[1], n[2], n[3]))
     24         return data
     25     def getTree(self, a):
     26         return self.createTree(a)
     27 
     28 '''链式存储的二叉树(非完全存储)'''
     29 class tree2(object):
     30     def __init__(self):
     31         self.L = None#Left node
     32         self.R = None#Right node
     33         self.V = None#value
     34         self.tmp = {}
     35     def createTree(self, key, tree):
     36         if key in self.tmp:
     37             tmpN = self.tmp[key]
     38             tree.V = tmpN[3]
     39             Lkey = tmpN[1]
     40             Rkey = tmpN[2]
     41             if Lkey != None:
     42                 Ltree = tree2()
     43                 Ltree = self.createTree(Lkey, Ltree)
     44                 tree.L = Ltree
     45             if Rkey != None:
     46                 Rtree = tree2()
     47                 Rtree = self.createTree(Rkey, Rtree)
     48                 tree.R = Rtree
     49         return tree
     50     def getTree(self, a):
     51         for n in a:
     52             self.tmp[n[0]] = n#收集各节点信息
     53         tree = tree2()
     54         return self.createTree('1', tree)
     55 
     56 '''判断二叉树存储结构'''
     57 def checkTree1orTree2(tree):
     58     if type(tree) == list:
     59         return 1#顺序存储
     60     else:
     61         return 2#链式存储
     62 
     63 '''获取根节点'''
     64 def root(tree):
     65     chk = checkTree1orTree2(tree)
     66     if chk == 1:#顺序存储
     67         childKeys = {}
     68         for t in tree:
     69             if t.L != None:
     70                 childKeys[t.L] = None
     71             if t.R != None:
     72                 childKeys[t.R] = None
     73         for t in tree:
     74             if t.S not in childKeys:
     75                 return t
     76     else:#链式存储
     77         return tree
     78 
     79 '''获取二叉树的度'''
     80 def degree(tree):
     81     chk = checkTree1orTree2(tree)
     82     if chk == 1:#顺序存储
     83         return len(tree)
     84     else:#链式存储
     85         cnt = 1
     86         if tree.L != None:
     87             cnt += degree(tree.L)
     88         if tree.R != None:
     89             cnt += degree(tree.R)
     90         return cnt
     91 
     92 '''深度'''
     93 def deepDegree(tree):
     94     chk = checkTree1orTree2(tree)
     95     if chk == 1:#顺序存储
     96         cnt = 0
     97         leafs = []#叶子集
     98         branchs = []#枝干集
     99         for t in tree:
    100             if t.L==None and t.R == None:
    101                 leafs.append(t)
    102             else:
    103                 branchs.append(t)
    104         save_cnt = 0
    105         for leaf in leafs:#回溯法 叶->枝->根
    106             cnt = 1
    107             key = leaf.S
    108             tmpBranchs = branchs.copy()
    109             i = 0
    110             while i < len(tmpBranchs):
    111                 branch = tmpBranchs[i]
    112                 if branch.L == key or branch.R == key:
    113                     cnt+=1
    114                     key = branch.S
    115                     i = 0
    116                 else:
    117                     i+=1
    118             if cnt > save_cnt:
    119                 save_cnt = cnt
    120         return save_cnt
    121     else:#链式存储
    122         cnt = 1
    123         Lcnt = 0
    124         Rcnt = 0
    125         if tree == None:
    126             return 0
    127         if tree.L != None:
    128             Lcnt = deepDegree(tree.L)
    129         if tree.R != None:
    130             Rcnt = deepDegree(tree.R)
    131         if Lcnt > Rcnt:
    132             cnt += Lcnt
    133         else:
    134             cnt += Rcnt
    135         return cnt
    136 
    137 '''链式结构二叉树
    138 前序遍历:根节点->左子树->右子树'''
    139 def preorder(tree, m, result):
    140     if m == 1:#非递归实现(栈)
    141         static = []#
    142         t = tree
    143         '''法1
    144         while t != None or static != []:
    145             while t != None:
    146                 result.append(t)
    147                 static.append(t)
    148                 t=t.L
    149             if static != []:
    150                 t = static.pop()
    151                 t = t.R
    152         '''
    153         static.append(tree)
    154         while static:
    155             n = static.pop()
    156             result.append(n)
    157             if n.R:
    158                 static.append(n.R)
    159             if n.L:
    160                 static.append(n.L)
    161 
    162     else:#递归实现
    163         if tree == None:
    164             return result
    165         result.append(tree)
    166         result=preorder(tree.L, 2, result)
    167         result=preorder(tree.R, 2, result)
    168     return result
    169 
    170 '''链式结构二叉树
    171 中序遍历:左子树->根节点->右子树'''
    172 def inorder(tree, m, result):
    173     if m == 1:#非递归实现(栈)
    174         static = []#
    175         t = tree
    176         '''法1
    177         while t != None or static != []:
    178             while t != None:
    179                 static.append(t)
    180                 t=t.L
    181             if static != []:
    182                 t = static.pop()
    183                 result.append(t)
    184                 t = t.R
    185         '''
    186         while t != None or static != []:
    187             while t != None:
    188                 static.append(t)
    189                 t = t.L
    190             t = static.pop()
    191             result.append(t)
    192             t = t.R
    193     else:#递归实现
    194         if tree == None:
    195             return result
    196         result=inorder(tree.L, 2, result)
    197         result.append(tree)
    198         result=inorder(tree.R, 2, result)
    199     return result
    200 
    201 '''链式结构二叉树
    202 后序遍历:左子树->右子树->根节点'''
    203 def postorder(tree, m, result):
    204     if m == 1:#非递归实现(栈)
    205         static = []#
    206         t = tree
    207         mk = None
    208         while t != None or static != []:
    209             while t != None:
    210                 static.append(t)
    211                 t = t.L
    212             t = static.pop()
    213             if t.R == None or t.R == mk:
    214                 result.append(t)
    215                 mk = t
    216                 t = None
    217             else:
    218                 static.append(t)
    219                 t = t.R
    220     else:#递归实现
    221         if tree == None:
    222             return result
    223         result = postorder(tree.L, 2, result)
    224         result = postorder(tree.R, 2, result)
    225         result.append(tree)
    226     return result
    227 
    228 '''order value print'''
    229 def resultPrintV(msg, rs):
    230     v=[]
    231     for t in rs:
    232         v.append(t.V)
    233     print(msg, v)
    234 
    235 
    236 '''期望高度'''
    237 
    238 
    239 def main():
    240     '''    1
    241 242         2    3
    243        ∧    ∧
    244       4  5  9  7
    245     ∧   ∧
    246    8 6 10 11'''
    247     data = [ #原始数据
    248             ['1', '2', '3', 1],#Self key, Left key, Right key, Value
    249             ['2', '4', '5', 2],
    250             ['3', '9', '7', 3],
    251             ['4', '8', '6', 4],
    252             ['5', '10', '11', 5],
    253             ['9', None, None, 9],
    254             ['7', None, None, 7],
    255             ['8', None, None, 8],
    256             ['6', None, None, 6],
    257             ['10', None, None, 10],
    258             ['11', None, None, 11],
    259            ]
    260     print('原始数据大小', sys.getsizeof(data))
    261     print('预计二叉树根节点值', 1)
    262     print('预计二叉树的度', 11)
    263     print('预计二叉树的深度', 4)
    264     print('预计前序遍历值的结果', [1, 2, 4, 8, 6, 5, 10, 11, 3, 9, 7])
    265     print('预计中序遍历值的结果', [8, 4, 6, 2, 10, 5, 11, 1, 9, 3, 7])
    266     print('预计后序遍历值的结果', [8, 6, 4, 10, 11, 5, 2, 9, 7, 3, 1])
    267 
    268     print('========>创建顺序结构二叉树')
    269     t1 = tree1().getTree(data)#顺序结构
    270     print('顺序结构二叉树大小', sys.getsizeof(t1))
    271     root1 = root(t1)
    272     print('顺序结构二叉树根节点值', root1.V)
    273     print('顺序结构二叉树的度', degree(t1))
    274     print('顺序结构二叉树的深度', deepDegree(t1))
    275 
    276     print('========>创建链式结构二叉树')
    277     t2 = tree2().getTree(data)#链式结构
    278     print('链式结构二叉树大小', sys.getsizeof(t2))
    279     root2 = root(t2)
    280     print('链式结构二叉树根节点值', root2.V)
    281     print('链式结构二叉树的度', degree(t2))
    282     print('链式结构二叉树的深度', deepDegree(t2))
    283     rs = [];resultPrintV('链式结构 前序遍历值的结果->非递归实现', preorder(t2, 1, rs))
    284     rs = [];resultPrintV('链式结构 前序遍历值的结果->递归实现', preorder(t2, 2, rs))
    285     rs = [];resultPrintV('链式结构 中序遍历值的结果->非递归实现', inorder(t2, 1, rs))
    286     rs = [];resultPrintV('链式结构 中序遍历值的结果->递归实现', inorder(t2, 2, rs))
    287     rs = [];resultPrintV('链式结构 后序遍历值的结果->非递归实现', postorder(t2, 1, rs))
    288     rs = [];resultPrintV('链式结构 后序遍历值的结果->递归实现', postorder(t2, 2, rs))
    289 
    290 if __name__ == '__main__':
    291     main()
  • 相关阅读:
    随机验证码生成
    python之map和filter
    Json学习笔记
    动态规划求区间最值问题RMQ(Range Minimum/Maximum Query)
    积水问题
    5亿个数找中位数
    Linux下进程间通信:命名管道mkfifo
    Trie树总结
    树的公共祖先问题LCA
    类文件结构
  • 原文地址:https://www.cnblogs.com/zzss/p/6222029.html
Copyright © 2020-2023  润新知