2011-09-23 86 views
3

我有一個二叉樹類,如下:Python的二叉樹序列化問題

class BTree: 
    def __init__(self, data, left=None, right=None): 
     self.data = data 
     self.left = left 
     self.right = right 

    def __unicode__(self): 
     return "%s" % self.data 

,我必須列示如下另一棵樹的序列化方法:

class JTree(object): 
    def __init__(self, id, children=None): 
     self.id = id 
     if children is None: 
      children=[] 
     self.children = children 

def encode_tree(obj): 
    if not isinstance(obj, JTree): 
     raise TypeError("%r is not JSON serializable" % (o,)) 

    return obj.__dict__ 

然後我填充二叉樹數據以下:

bt = BTree("1") 
bt.left =BTree("2") 
bt.right=BTree("3") 

所以如果我序列化的數據,我可以得到以下結果:

tree = JTree(bt.data, [JTree(bt.left.data), JTree(bt.right.data)]) 

print json.dumps(tree, default=encode_tree) 


{"id": "1", "children": [{"id": "2", "children": []}, {"id": "3", "children": []}]} 

問題是,我無法弄清楚如何編寫一段代碼來生成結果。這意味着我想要一個發電機或遞歸函數來運行代碼:

JTree(bt.data, [JTree(bt.left.data), JTree(bt.right.data)]) 

有人可以給我一個想法嗎?謝謝

回答

2

在我看來,你要像一個簡單的遞歸函數:

def convert_to_jtree(bt): 
    return JTree(bt.data, [convert_to_jtree(bt.left) if bt.left else None, 
          convert_to_jtree(bt.right) if bt.right else None]) 

或非常類似的東西。

+0

這非常酷!感謝您解決我的問題!有一個小修正:convert_to_jtree(bt.left) – georgehu

+0

@georgehu:是的,你說得很對。很高興我能幫上忙。 –

0

json模塊只能序列化字典,列表,字符串,數字,布爾值和None。不要爲此使用自定義類,請考慮使用plain-ol dict s。或者,您可以繼承json.JsonEncoder並覆蓋default方法,以便它爲您的自定義類返回其中一種類型。

+0

其實它的確如此。我剛剛添加了json.dumps。不過,我的問題是,有沒有辦法像這樣運行代碼:JTree(bt.data,[JTree(bt.left.data),JTree(bt.right.data)]) – georgehu