先来设计下怎么实现二叉树,首先一个节点类和树类是需要的,所以需要class node 和class tree
class node:
def __init__(self):
pass
class tree:
def __init__(self):
pass
接下来是看功能,节点和树需要实例化,同时树需要一个add方法来把新的节点加进去,可以确定的是,无论是树实例化时根节点是空的,节点类实例化时则是有数的。
class Node(object):
def __init__(self,number):
self.number=number
self.rchild=None
self.lchild=None
class Tree(object):
def __init__(self):
self.root=None
def add(self,number):
pass
接下来就是核心问题,怎么把增加新节点,第一步当然要先判断树是否为空
def add(self,number):
node=Node(number)
if self.root==None:
self.root=node
else:
pass
在确定树不为空之后要怎么处理呢?
我们来看下二叉树的结构
由于这里只是单纯的二叉树,而不是排序二叉树,所以不需要考虑数的大小关系等,也就是说可以按先后顺序插入顺序可以设计成root,root->left,root-rght这样,好处在于,root插入后,root左右为空,这时插入root->left,然后再是root->right,这样能够确保root的2个子节点都有值,而不至于绕过root->rigth直接插入root->left->left这样的异常情况出现。
基于这样的设计,我们使用list来存储任意子节点为空的节点,换句话说,只要你这个节点不是左右节点都存在的情况下,我下次插入节点就会考虑你。具体实现我们使用list来模拟队列,root,root->left,root->right依次入队,
class Node(object):
def __init__(self,number):
self.number=number
self.lchild=None
self.rchild=None
class Tree(object):
lis=[]
def __init__(self):
self.root=None
def add(self,number):
node=Node(number)
if self.root==None:
self.root=node
Tree.lis.append(self.root)
else:
while True:
point=Tree.lis[0]
if point.lchild==None:
point.lchild=node
Tree.lis.append(point.lchild)
return
elif point.rchild==None:
point.rchild=node
Tree.lis.append(point.rchild)
Tree.lis.pop(0)
return
add基本的逻辑就是利用队列依次保存未满状态的节点,然后通过不断取队头来添加左右孩子,并把左右孩子加入队列,插入完后检查是否走有孩子都有了,依然未满,则保留,满了,则退出队列取下一个队首。
现在我们来测试:
if __name__=='__main__':
t=Tree()
L = [1,2,3,4,5,6,7]
for x in L:
t.add(x)
print 'success'
E:\protalenv\Scripts\python.exe C:/Users/26954/Desktop/shel.py
success
success
success
success
success
success
success
Process finished with exit code 0
可以看到二叉树成功的建立了