python实现二叉树
二叉树的简介
二叉树是有限个数据元素的集合,该元素或者为空,或者由一个称为根的元素及两个不相交的,被分别称为根的左子树和根的右子树的树组成,当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点
如果一颗二叉树每一层的结点个数都达到了最大,这颗二叉树称作满二叉树。区别于完全二叉树完全二叉树相对于满二叉树而言,只是删除了满二叉树最底层最右边的连续若干个节点,这样形成的二叉树称为完全二叉树。
举例
满二叉树
非满二叉树
完全二叉树
非完全二叉树
实现的方法
遍历二叉树时按照某种顺序访问二叉树的每个节点,使每个节点被访问一次且仅被访问一次。我们把D,L,R分别表示访问根节点,遍历根节点的左子树,遍历根节点的右子树。中序遍历为LDR,先序遍历DLR,后续遍历LRD
这里我们已先序遍历为例子介绍:
先序遍历的递归过程:若二叉树为空,遍历结束,否则按照下面顺序遍历:
(1)访问根节点
(2)先序遍历根节点的左子树
(3)先序遍历根节点的右子树
同理可知后序以及中序的实现过程
层次遍历:
在上面的图中层次遍历的结果为ABCDEFG
层次遍历的定义
所谓层次遍历是指二叉树的第一个开始从上至下逐层遍历,在同一层,则按从左到右顺序对节点逐个访问。
在实现
实现的代码
class Node(object):
def __init__(self,item):
self.item=item
self.left=None
self.right=None
class Tree(object):
def __init__(self):
self.root=None #首先定义一个根节点
def add(self,item):
node=Node(item) #i将tem其转化为Node型
queue=[self.root] #用队列存储根节点
if self.root is None:
self.root=node #如果根节点为空那么就将node赋值给根节点root
return
while queue: #只要队列不为空就执行while语句里面的内容
cur_node=queue.pop(0) # cur_node用于存储队列弹出的元素
if cur_node.left is None:
cur_node.left=node #判断左子树是否为空,为空则把node赋值给左子树
return
else:
queue.append(cur_node.left) #如果不是空,则把cur_node.的左孩子放入队列当中
if cur_node.right is None:
cur_node.right=node#判断左子树是否为空,为空则把node赋值给右子树
return
else:
queue.append(cur_node.right)
def breadth_travel(self):
"""层次遍历"""
if self.root is None:
return
queue=[self.root]
while queue:
cur_node=queue.pop(0)
print(cur_node.item,end=" ")
if cur_node.left is not None:
queue.append(cur_node.left)
if cur_node.right is not None:
queue.append(cur_node.right)
def preorder(self,root):
"""先序遍历"""
if root is None:
return
print(root.item,end=" ")
self.preorder(root.left)
self.preorder(root.right)
def inorder(self,root):
"""中序遍历"""
if root is None:
return
self.inorder(root.left)
print(root.item,end=" ")
self.inorder(root.right)
def afterorder(self,root):
"""后序遍历"""
if root is None:
return
self.afterorder(root.left)
self.afterorder(root.right)
print(root.item,end=" ")
tree=Tree()
tree.add(1)
tree.add(2)
tree.add(3)
tree.add(4)
tree.add(5)
tree.add(6)
tree.add(7)
tree.add(8)
tree.add(9)
print("层次遍历结果:")
tree.breadth_travel()
print("\n")
print("先序遍历结果:")
tree.preorder(tree.root)
print("\n")
print("中序遍历结果:")
tree.inorder(tree.root)
print("\n")
print("后序遍历结果:")
tree.afterorder(tree.root)
拓展:
一颗二叉树的遍历结果如下:
先序遍历结果:
1 2 4 8 9 5 3 6 7
中序遍历结果:
8 4 9 2 5 1 6 3 7
后序遍历结果:
8 9 4 5 2 6 7 3 1
给定先序和中序遍历结果求后续遍历结果(无二叉树图形)
给定后序和中序遍历结果求后续遍历结果(无二叉树图形)
后续遍历与先序遍历类似,只是后续遍历根节点实在右边。笔者不在一一分析。