python二叉树操作
2018-11-27 本文已影响0人
爱搞事的喵
1.树的定义: 树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示。树在计算机领域中也得到广泛应用,如在编译源程序时,可用树表示源程序的语法结构。又如在数据库系统中,树型结构也是信息的重要组织形式之一。一切具有层次关系的问题都可用树来描述。
- 树结构的特点是:它的每一个结点都可以有不止一个直接后继,除根结点外的所有结点都有且只有一个直接前驱。
3.树的递归定义如下:
(1)至少有一个结点(称为根)
(2)其它是互不相交的子树
- 二叉树:
二叉树是由n(n≥0)个结点组成的有限集合、每个结点最多有两个子树的有序树。它或者是空集,或者是由一个根和称为左、右子树的两个不相交的二叉树组成。
特点:
(1)二叉树是有序树,即使只有一个子树,也必须区分左、右子树;
(2)二叉树的每个结点的度不能大于2,只能取0、1、2三者之一;
(3)二叉树中所有结点的形态有5种:空结点、无左右子树的结点、只有左子树的结点、只有右子树的结点和具有左右子树的结点。
5.树的遍历顺序大体分为三种:前序遍历(先根遍历、先序遍历),中序遍历(中根遍历),后序遍历(后根遍历)。
代码实现:
class TreeNode(object):
def __init__(self,data=0,left=0,right=0):
self.data = data
self.left = left
self.right = right
class BTree(object):
def __init__(self,root=0):
self.root = root
def is_empty(self):
'''
判断二叉树是不是为空
:return:
'''
if self.root == 0:
return True
return False
def preOrder(self,treeNode):
'''
先序遍历: 根节点>左节点>右节点
:return:
'''
if treeNode is 0:
return
print('------------preOrder-------------%s',treeNode.data)
self.preOrder(treeNode.left)
self.preOrder(treeNode.right)
def inOrder(self,treeNode):
'''
中序遍历:左节点>根节点>右节点
:return:
'''
if treeNode is 0:
return
self.inOrder(treeNode.left)
print('--------------inOrder-------------%s',treeNode.data)
self.inOrder(treeNode.right)
def postOrder(self,treeNode):
'''
后续遍历:右节点>左节点>根节点
:return:
'''
if treeNode is 0:
return
self.postOrder(treeNode.right)
self.postOrder(treeNode.left)
print("-------------postOrder--------------%s",treeNode.data)
n1 = TreeNode(data=1)
n2 = TreeNode(2,n1)
n3 = TreeNode(3)
n4 = TreeNode(4,n2,n3)
n5 = TreeNode(5,n4)
n6 = TreeNode(6,n5)
n7 = TreeNode(7)
root = TreeNode('root',n6,n7)
bt = BTree(root)
bt.preOrder(bt.root)
bt.inOrder(bt.root)
bt.postOrder(bt.root)