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