【DataStructure In Python】Python模拟二叉树

使用Python模拟二叉树的基本操作,感觉写起来很别扭。最近做编译的优化,觉得拓扑排序这种东西比较强多。近期刷ACM,发现STL不会用实在太伤了。决定花点儿时间学习一下STL。Boost其实也很强大。关于Python最近没什么时间搞了,忙着复试了。不过,挺喜欢这语言的。复试完继续大战PythonChallenge。

  1 #! /usr/bin/env python
  2 # DataStrucure Tree
  3 
  4 import sys
  5 
  6 class BTNode:
  7     
  8     def __init__(self, data, lchild=None, rchild=None):
  9         self.data = data
 10         self.lchild = lchild
 11         self.rchild = rchild
 12 
 13     def __str__(self):
 14         print "root: %s  lchild: %s  rchild: %s" % (data, lchild.data, rchild.data)
 15     
 16 
 17 class BTree:
 18     
 19     def __init__(self, data=None, ldata=None, rdata=None):
 20         self.root = BTNode(data)
 21         self.root.lchild = BTNode(ldata)
 22         self.root.rchild = BTNode(rdata)
 23     
 24     def isEmpty(self):
 25         if self.root.data is None:
 26             return 1
 27         else:
 28             return 0
 29         
 30 
 31     def findNode(self, data):
 32         lst = []
 33         if self.isEmpty():
 34             print "The tree is empty."
 35             return None
 36         lst.append(self.root)
 37         while len(lst):
 38             BTemp = lst.pop(0)
 39             if BTemp.data == data:
 40                 return BTemp
 41             if BTemp.lchild is not None:
 42                 lst.append(BTemp.lchild)
 43             if BTemp.rchild is not None:
 44                 lst.append(BTemp.rchild)
 45         return None
 46     
 47     def addchilds(self, data, ldata=None, rdata=None):
 48         BTemp = self.findNode(data)
 49         if BTemp is None:
 50             print "Can't find Node: %s"    % data
 51             return 0
 52         else:
 53             BTemp.lchild = None if ldata is None else BTNode(ldata)
 54             BTemp.rchild = None if rdata is None else BTNode(rdata)
 55             return 1
 56 
 57     def levelorder(self):
 58         if self.isEmpty():
 59             print "Root is not initialized."
 60             return
 61         lst = []
 62         lst.append(self.root)
 63         while len(lst):
 64             BTemp = lst.pop(0)
 65             print "-> %s" % BTemp.data,
 66             if BTemp.lchild is not None:
 67                 lst.append(BTemp.lchild)
 68             if BTemp.rchild is not None:
 69                 lst.append(BTemp.rchild)
 70 
 71     def preorder(self, Node):
 72         if Node is not None:
 73             print "-> %s" % Node.data,
 74             self.preorder(Node.lchild)
 75             self.preorder(Node.rchild)
 76 
 77     def inorder(self, Node):
 78         if Node is not None:
 79             self.inorder(Node.lchild)
 80             print "-> %s" % Node.data,
 81             self.inorder(Node.rchild)
 82 
 83     def postorder(self, Node):
 84         if Node is not None:
 85             self.postorder(Node.lchild)
 86             self.postorder(Node.rchild)
 87             print "-> %s" % Node.data,
 88     
 89     def __str__(self):
 90         if self.isEmpty():
 91             print "Root is not initialized."
 92             return None        
 93         tmp = ""
 94         lst = []
 95         lst.append(self.root)
 96         while len(lst):
 97             BTemp = lst.pop(0)
 98             tmp += ("-> %s " % BTemp.data)
 99             if BTemp.lchild is not None:
100                 lst.append(BTemp.lchild)
101             if BTemp.rchild is not None:
102                 lst.append(BTemp.rchild)
103         return tmp
104 
105 if __name__ == "__main__":
106     tree = BTree('A')
107     tree.addchilds('A','B','C')
108     tree.addchilds('B','D','E')
109     tree.addchilds('C','F', None)
110     print "\n","-"*5,"    Find   ","-"*5
111     tmp = tree.findNode('B')
112     if tmp is not None:
113         print "Found 'B', lchild is %s, rchild is %s." % (tmp.lchild.data, tmp.rchild.data)
114     else:
115         print "Not found 'B'."
116     print "\n","-"*5," Preorder  ","-"*5
117     tree.preorder(tree.root)
118     print "\n\n","-"*5,"  Inorder  ","-"*5
119     tree.inorder(tree.root)
120     print "\n\n","-"*5," Postorder ","-"*5
121     tree.postorder(tree.root)
122     print "\n\n","-"*5," Lvlorder  ","-"*5
123     tree.levelorder()
124     print "\n\n"
View Code

 

posted on 2014-03-13 22:29  Bombe  阅读(554)  评论(0编辑  收藏  举报

导航