介绍:树形结构是应用相当广泛的一种非线性结构,建立与应用大多使用链表来处理,当然也可用连续的列表来实现
常见概念:
满二叉树:如果树高位H,树的结点总数为2*H-1,H>=0,称为满二叉树
完全二叉树:高度为H,节点数小于2*H-1,但节点的编号方式与满二叉树一致
斜二叉树:当一个二叉树完全没有左节点或者右节点的时候,称为左斜二叉树或者右斜二叉树
严格二叉树:每一个非终端的节点均有非空的左右子树
1.用数组实现二叉树
规则:左子树的节点索引值是父节点索引值乘2
右子树的节点索引值是父节点索引值乘2加1
每一个树根的值大于左子树值小于友子树值
创建函数:
defBetree(betree,data,length):for i in range(1,length):
level= 1
while betree[level] !=0:if betree[level] >data[i]:
level= level*2
else:
level= level*2+1betree[level]=data[i]return betree
2.链表实现二叉树
有点:节点的增加和删除容易实现,缺点:很难找到父节点
classtree:def __init__(self):
self.data=0
self.left=None
self.right=None
def creat_tree(root,val):
newnode=tree()
newnode.data=val
newnode.left=None
newnode.right=None
if root==None:
root=newnode
return root
else:
current=root
while current != None:
backup = current
if current.data > val:
current=current.left
else:
current=current.right
if backup.data > val:
backup.left = newnode
else:
backup.right = newnode
3.二叉树遍历
三种遍历方法:
#中序遍历
definorder(ptr):if ptr !=None:
inorder(ptr.left)print("%4d"%ptr.data,end="")
inorder(ptr.right)print()#后序遍历
defpostorder(ptr):if ptr !=None:
postorder(ptr.left)
postorder(ptr.right)print("%4d"%ptr.data,end="")print()#前序遍历
defpreorder(ptr):if ptr !=None:print("%4d"%ptr.data,end="")
preorder(ptr.left)
preorder(ptr.right)
4.二叉树节点查找
原则:从树根出发进行比较,如果小于树根,左子树查找,大于树根,右子树查找,找到要查找的值
defsearch(ptr,val):whileTrue:if ptr ==None:returnNoneif ptr.data ==val:returnptrelse:if ptr.data >val:
ptr=ptr.leftelse:
ptr= ptr.right
5.二叉树节点的删除
a.删除的节点位叶子,只需将与其相连的父节点指向None
b.删除节点只有一棵子树,将其子树移到该节点的父节点指向
c.删除节点有左右两个子树,将左右子树中值较大的子树移到该结点处