遍历二叉树
二叉树的特性一律从左向右遍历
- 中序遍历:左子树-树根-右子树
- 前序遍历:树根-左子树-右子树
- 后序遍历:左子树-右子树-树根
1,中序遍历
中序遍历子程序
def inorder(ptr):
if ptr != None:
inorder(ptr.left)
print('[%2d]' % ptr.data,end=' ')
inorder(ptr.right)
2.后序遍历
def postorder(ptr):
if ptr != None:
postorder(ptr.left)
postorder(ptr.right)
print('[%2d]' % ptr.data,end=' ')
3.前序遍历
def perorder(ptr):
if ptr != None:
print('[%2d]'% ptr.data, end =' ')
perorder(ptr.left)
perorder(ptr.right)
建立一个二叉树,节点数据分别是[5,6,24,8,12,3,17,1,9],根据链表建立二叉树,最后进行中序遍历,可以发现可以轻松完成从小到大的排序
'''
建立二叉树的节点
'''
class tree:
def __init__(self):
self.data = 0
self.left = None
self.right = None
# 建立二叉树
def create_tree(root,val):
#将传入的int类型的val转换为树节点类型
newnode = tree()
newnode.data = val
newnode.right = None
newnode.left = None
#如果传入的root为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
return root
#主程序
data = [5,6,24,8,12,3,17,1,9]
ptr = None
for i in range(len(data)):
ptr = create_tree(ptr,data[i])
print("=============================================")
print('中序完成的结果')
inorder(ptr)
print('')
print("=============================================")
print('前序完成的结果')
perorder(ptr)
print('')
print("=============================================")
print('后序完成的结果')
postorder(ptr)
print('')
=============================================
中序完成的结果
[ 1] [ 3] [ 5] [ 6] [ 8] [ 9] [12] [17] [24]
=============================================
前序完成的结果
[ 5] [ 3] [ 1] [ 6] [24] [ 8] [12] [ 9] [17]
=============================================
后序完成的结果
[ 1] [ 3] [ 9] [17] [12] [ 8] [24] [ 6] [ 5]
二叉树的查找
def search(ptr,val):
while True:
if ptr == None:
return None
if ptr.data == val:
return ptr
elif ptr.data > val:
ptr = ptr.left
else:
ptr = ptr.right
二叉树的插入
- 判断二叉树中是否有这个值,有不用操作,没有就将它插入在树中
data = [1,4,6,23,2,12,24]
ptr = None
for val in data:
ptr = create_tree(ptr,val)
inorder(ptr)
data = int(input('输入要插入的数:'))
if search(ptr,data) != None:
raise Exception('二叉树中已经有此节点')
else:
create_tree(ptr,data)
inorder(ptr)
[ 1] [ 2] [ 4] [ 6] [12] [23] [24] 输入要插入的数:5667
[ 1] [ 2] [ 4] [ 6] [12] [23] [24] [5667]
二叉节点的删除
- 如果删除的节点为树叶,只要将与其相连的父节点指向None
- 删除的节点只有一颗子树,将它的右指针字段放在它的父节点字段
- 删除的节点有两颗子树,有两种处理办法
- 找到中序立即先行者,找到该节点的左子树一直往右寻找,直到右指针为None
- 找到中序立即后继者,找到该节点的右子树一直往左寻找,直到左指针为None