python实现二叉树
class Node:
def __init__(self,item):
'''二叉树的节点'''
self.item = item
self.lchild = None
self.rchild = None
class Tree:
'''二叉树'''
def __init__(self,root= None):
self.root = root
def add(self,item):
'''添加节点'''
node = Node(item) # 生成节点
if self.root == None:
self.root = node
else:
queue = [] # 创建队列 存放要判断的节点
queue.append(self.root)
while queue:
cur = queue.pop(0)
# 弹出列表第一个结点
if cur.lchild is None:
# 判断结点左孩子是否为空
cur.lchild = node
return
elif cur.rchild is None:
# 判断结点左孩子是否为空
cur.rchild = node
return
else:
# 若果结点的左右都有结点,则将在左右子节点放入判断的列表中
queue.append(cur.lchild)
queue.append(cur.rchild)
def breadth_travel(self):
'''层次遍历,广度优先遍历'''
if self.root == None:
return
queue = [self.root] # 将根节点放入队列
while queue:
cur = queue.pop(0) # 从列表中拿出第一个元素
print(cur.item)
if cur.lchild:
queue.append(cur.lchild)
if cur.rchild:
queue.append(cur.rchild)
def preorder(self,root):
'''先序遍历,根左右'''
if root is None:
return
print(root.item)
self.preorder(root.lchild)
self.preorder(root.rchild)
def inorder(self, root):
'''中序遍历,左根右'''
if root is None:
return
self.inorder(root.lchild)
print(root.item)
self.inorder(root.rchild)
def postorder(self,root):
'''后序遍历,左右根'''
if root is None:
return
self.postorder(root.lchild)
self.postorder(root.rchild)
print(root.item)
广度优先遍历:
按照层次,从上至下,从左至右遍历。
深度优先遍历:
- 前序遍历:根节点–>左子树–>右子树
- 中序遍历:左子树–>根节点–>右子树
- 后序遍历:左子树–>右子树–>根节点
创建一个二叉树,并且使用不同的方式遍历。
if __name__ == '__main__':
tree = Tree()
tree.add('a')
tree.add('b')
tree.add('c')
tree.add('d')
tree.add('e')
tree.add('f')
tree.add('g')
tree.add('h')
tree.add('i')
tree.breath_travel()
print('-------------------------------------')
tree.preorder(tree.root)
print('-------------------------------------')
tree.inorder(tree.root)
print('-------------------------------------')
tree.postorder(tree.root)
运行结果如下:
# 广度优先遍历
a
b
c
d
e
f
g
h
i
-------------------------------------
# 前序遍历
a
b
d
h
i
e
c
f
g
-------------------------------------
# 中序遍历
h
d
i
b
e
a
f
c
g
-------------------------------------
# 后序遍历
h
i
d
e
b
f
g
c
a