二叉树的遍历,查找,插入

遍历二叉树

二叉树的特性一律从左向右遍历

  • 中序遍历:左子树-树根-右子树
  • 前序遍历:树根-左子树-右子树
  • 后序遍历:左子树-右子树-树根

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

猜你喜欢

转载自blog.csdn.net/qq_20966795/article/details/85002712