Python实现二叉排序树的搜索、插入、删除

代码: 

import sys
import gc
sys.path.append("F:\Workspace")
from Algorithm.TreeNode import TreeNode


def SearchBST(t: TreeNode, key: int)->bool:
    if t is None:
        return False
    if key == t.val:
        return True
    elif key < t.val:
        return SearchBST(t.left, key)
    else:
        return SearchBST(t.right, key)


def InsertBST(t: TreeNode, key: int)->TreeNode:
    new_t = TreeNode(key, None, None)
    if t is None:
        t = new_t
    else:
        if key < t.val:
            t.left = InsertBST(t.left, key)
        elif key > t.val:
            t.right = InsertBST(t.right, key)
    return t


def DeleteBST(t: TreeNode, key: int)->bool:
    if t is None:
        return False
    else:
        if key == t.val:
            return Delete(t)
        elif key < t.val:
            return DeleteBST(t.left, key)
        else:
            return DeleteBST(t.right, key)


def Delete(p: TreeNode)->bool:
    if p.right is None:  # 右子树为空,只需重接左子树
        q = p
        p = p.left
        del q
    elif p.left is None:  # 左子树为空,只需重接右子树
        q = p
        p = p.right
        del q
    else:                 # 左右子树都不为空
        q, s = p, p.left
        while s.right:
            q = s
            s = s.right
        p.val = s.val
        if q != p:
            q.right = s.left
        else:
            q.left = s.left
        del s
    gc.collect()
    return True


def inorder_traversal(t: TreeNode):
    if t is None:
        return
    inorder_traversal(t.left)
    print(t.val, end=" ")
    inorder_traversal(t.right)


if __name__ == '__main__':
    root = TreeNode(62,
                    TreeNode(58, TreeNode(47, TreeNode(35, None, TreeNode(37, None, None)), TreeNode(51, None, None)), None),
                    TreeNode(88, TreeNode(73, None, None), TreeNode(99, TreeNode(93, None, None), None))
                    )
    print("中序遍历二叉排序树:", end=" ")
    inorder_traversal(root)
    print()
    print("搜索47结点的结果:", SearchBST(root, 47))
    print("插入结点49的结果:", InsertBST(root, 49))
    print("中序遍历二叉排序树:", end=" ")
    inorder_traversal(root)
    print()
    print("删除结点47的结果:", DeleteBST(root, 47))
    print("中序遍历二叉排序树:", end=" ")
    inorder_traversal(root)

输出:

中序遍历二叉排序树: 35 37 47 51 58 62 73 88 93 99 
搜索47结点的结果: True
插入结点49的结果: <Algorithm.TreeNode.TreeNode object at 0x000001EBBB3FA208>
中序遍历二叉排序树: 35 37 47 49 51 58 62 73 88 93 99 
删除结点47的结果: True
中序遍历二叉排序树: 35 37 49 51 58 62 73 88 93 99 

猜你喜欢

转载自blog.csdn.net/qq_38890412/article/details/105455476