class BinTreeNode ( object ) :
def __init__ ( self, data= None , left= None , right= None ) :
self. data, self. left, self. right = data, left, right
class BinTree ( object ) :
def __init__ ( self, root) :
self. root = root
@classmethod
def build_from ( cls, node_list) :
"""通过节点信息构造二叉树
第一次遍历:构造node节点
第二次遍历:给root和孩子赋值
最后用root初始化这个类并返回一个对象
"""
node_dict = { }
for node_data in node_list:
data = node_data[ 'data' ]
node_dict[ data] = BinTreeNode( data)
for node_data in node_list:
data = node_data[ 'data' ]
node = node_dict[ data]
if node_data[ 'is_root' ] :
root = node
node. left = node_dict. get( node_data[ 'left' ]
node. right = node_dict. get( node_data[ 'right' ]
return cls( root)
def preorder_trav ( self, subtree) :
if subtree is not None :
print ( subtree. data)
self. preorder_trav( subtree. left)
self. preorder_trav( subtree. right)
def inorder_trav ( self, subtree) :
if subtree is not None :
self. inorder_trav( subtree. left)
print ( subtree. data)
self. inorder_trav( subtree. right)
def postorder_trav ( self, subtree) :
if subtree is not None :
self. postorder_trav( subtree. left)
self. postorder_trav( subtree. right)
print ( subtree. data)
def reverse ( self, subtree) :
if subtree is not None :
subtree. left, subtree. right = subtree. right, subtree. left
self. reverse( subtree. left)
self. reverse( subtree. right)
node_list = [
{ 'data' : 'A' , 'left' : 'B' , 'right' : 'C' , 'is_root' : True } ,
{ 'data' : 'B' , 'left' : 'D' , 'right' : 'E' , 'is_root' : False } ,
{ 'data' : 'D' , 'left' : None , 'right' : None , 'is_root' : False } ,
{ 'data' : 'E' , 'left' : 'H' , 'right' : None , 'is_root' : False } ,
{ 'data' : 'H' , 'left' : None , 'right' : None , 'is_root' : False } ,
{ 'data' : 'C' , 'left' : 'F' , 'right' : 'G' , 'is_root' : False } ,
{ 'data' : 'F' , 'left' : None , 'right' : None , 'is_root' : False } ,
{ 'data' : 'G' , 'left' : 'I' , 'right' : 'J' , 'is_root' : False } ,
{ 'data' : 'I' , 'left' : None , 'right' : None , 'is_root' : False } ,
{ 'data' : 'J' , 'left' : None , 'right' : None , 'is_root' : False } ,
]
btree = BinTree. build_from( node_list)
btree. preorder_trav( btree. root)
% + + + + + + + + + + + + + + + + + + + + + + + + + + + + >
result: A B D E H C F G I J
% + + + + + + + + + + + + + + + + + + + + + + + + + + + + >
btree. inorder_trav( btree. root)
% + + + + + + + + + + + + + + + + + + + + + + + + + + + + >
result: D B H E A F C I G J
% + + + + + + + + + + + + + + + + + + + + + + + + + + + + >
btree. postorder_trav( btree. root)
% + + + + + + + + + + + + + + + + + + + + + + + + + + + + >
result: D H E B F I J G C A
% + + + + + + + + + + + + + + + + + + + + + + + + + + + + >
btree. reverse( btree. root)
btree. preorder_trav( btree. root)
% + + + + + + + + + + + + + + + + + + + + + + + + + + + + >
result: A C G J I F B E H D
% + + + + + + + + + + + + + + + + + + + + + + + + + + + + >
小结:
在构建二叉树对象时,定义了build_from()函数,由于我们传递的参数使用了cls(表示class),表示可以通过类直接调用,不能忘记在def前面加上@classmethod !!! 先序遍历、中序遍历、后序遍历的时间复杂度都为O(n).