复制二叉树python_二叉树的python实现

1 '''

2 Created on 2016/12/263 Created by freeol.cn4 一些排序算法的Python实现5 @author: 拽拽绅士6 '''

7

8 importsys9 from _ast importWhile10 from celery.bin.celery importresult11

12 '''顺序存储的二叉树实现(非完全存储)'''

13 classnode1(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 classtree1(object):20 defcreateTree(self, a):21 data =[]22 for n ina:23 data.append(node1(n[0], n[1], n[2], n[3]))24 returndata25 defgetTree(self, a):26 returnself.createTree(a)27

28 '''链式存储的二叉树(非完全存储)'''

29 classtree2(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 defcreateTree(self, key, tree):36 if key inself.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 =Ltree45 if Rkey !=None:46 Rtree =tree2()47 Rtree =self.createTree(Rkey, Rtree)48 tree.R =Rtree49 returntree50 defgetTree(self, a):51 for n ina:52 self.tmp[n[0]] = n#收集各节点信息

53 tree =tree2()54 return self.createTree('1', tree)55

56 '''判断二叉树存储结构'''

57 defcheckTree1orTree2(tree):58 if type(tree) ==list:59 return 1#顺序存储

60 else:61 return 2#链式存储

62

63 '''获取根节点'''

64 defroot(tree):65 chk =checkTree1orTree2(tree)66 if chk == 1:#顺序存储

67 childKeys ={}68 for t intree:69 if t.L !=None:70 childKeys[t.L] =None71 if t.R !=None:72 childKeys[t.R] =None73 for t intree:74 if t.S not inchildKeys:75 returnt76 else:#链式存储

77 returntree78

79 '''获取二叉树的度'''

80 defdegree(tree):81 chk =checkTree1orTree2(tree)82 if chk == 1:#顺序存储

83 returnlen(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 returncnt91

92 '''深度'''

93 defdeepDegree(tree):94 chk =checkTree1orTree2(tree)95 if chk == 1:#顺序存储

96 cnt =097 leafs = []#叶子集

98 branchs = []#枝干集

99 for t intree:100 if t.L==None and t.R ==None:101 leafs.append(t)102 else:103 branchs.append(t)104 save_cnt =0105 for leaf in leafs:#回溯法 叶->枝->根

106 cnt = 1

107 key =leaf.S108 tmpBranchs =branchs.copy()109 i =0110 while i

114 key =branch.S115 i =0116 else:117 i+=1

118 if cnt >save_cnt:119 save_cnt =cnt120 returnsave_cnt121 else:#链式存储

122 cnt = 1

123 Lcnt =0124 Rcnt =0125 if tree ==None:126 return0127 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 +=Lcnt133 else:134 cnt +=Rcnt135 returncnt136

137 '''链式结构二叉树138 前序遍历:根节点->左子树->右子树'''

139 defpreorder(tree, m, result):140 if m == 1:#非递归实现(栈)

141 static = []#栈

142 t =tree143 '''法1144 while t != None or static != []:145 while t != None:146 result.append(t)147 static.append(t)148 t=t.L149 if static != []:150 t = static.pop()151 t = t.R152 '''

153 static.append(tree)154 whilestatic:155 n =static.pop()156 result.append(n)157 ifn.R:158 static.append(n.R)159 ifn.L:160 static.append(n.L)161

162 else:#递归实现

163 if tree ==None:164 returnresult165 result.append(tree)166 result=preorder(tree.L, 2, result)167 result=preorder(tree.R, 2, result)168 returnresult169

170 '''链式结构二叉树171 中序遍历:左子树->根节点->右子树'''

172 definorder(tree, m, result):173 if m == 1:#非递归实现(栈)

174 static = []#栈

175 t =tree176 '''法1177 while t != None or static != []:178 while t != None:179 static.append(t)180 t=t.L181 if static != []:182 t = static.pop()183 result.append(t)184 t = t.R185 '''

186 while t != None or static !=[]:187 while t !=None:188 static.append(t)189 t =t.L190 t =static.pop()191 result.append(t)192 t =t.R193 else:#递归实现

194 if tree ==None:195 returnresult196 result=inorder(tree.L, 2, result)197 result.append(tree)198 result=inorder(tree.R, 2, result)199 returnresult200

201 '''链式结构二叉树202 后序遍历:左子树->右子树->根节点'''

203 defpostorder(tree, m, result):204 if m == 1:#非递归实现(栈)

205 static = []#栈

206 t =tree207 mk =None208 while t != None or static !=[]:209 while t !=None:210 static.append(t)211 t =t.L212 t =static.pop()213 if t.R == None or t.R ==mk:214 result.append(t)215 mk =t216 t =None217 else:218 static.append(t)219 t =t.R220 else:#递归实现

221 if tree ==None:222 returnresult223 result = postorder(tree.L, 2, result)224 result = postorder(tree.R, 2, result)225 result.append(tree)226 returnresult227

228 '''order value print'''

229 defresultPrintV(msg, rs):230 v=[]231 for t inrs:232 v.append(t.V)233 print(msg, v)234

235

236 '''期望高度'''

237

238

239 defmain():240 '''1241 ∧242 2 3243 ∧ ∧244 4 5 9 7245 ∧ ∧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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值