数据结构与算法之数据结构 二叉树插入 二叉搜索树 / 平衡树

数据结构与算法阿木 发布于 3 天前 1 次阅读


摘要:

二叉树是一种常见的数据结构,它在计算机科学中有着广泛的应用。本文将围绕二叉树的插入操作展开,首先介绍二叉搜索树的插入过程,然后探讨如何将二叉搜索树转换为平衡树,最后通过代码示例详细解析这两种插入方法。

一、

二叉树是一种特殊的树形结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树在计算机科学中有着广泛的应用,如排序、搜索、路径查找等。本文将重点介绍二叉树的插入操作,包括二叉搜索树的插入和平衡树的插入。

二、二叉搜索树插入

二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树,它具有以下性质:

1. 每个节点都有一个键值(key)。

2. 左子节点的键值小于其父节点的键值。

3. 右子节点的键值大于其父节点的键值。

4. 左右子树也都是二叉搜索树。

二叉搜索树的插入操作如下:

1. 从根节点开始,比较待插入节点的键值与当前节点的键值。

2. 如果待插入节点的键值小于当前节点的键值,则将待插入节点插入到当前节点的左子树。

3. 如果待插入节点的键值大于当前节点的键值,则将待插入节点插入到当前节点的右子树。

4. 重复步骤1-3,直到找到合适的插入位置。

以下是一个简单的二叉搜索树插入操作的Python代码示例:

python

class TreeNode:


def __init__(self, key):


self.left = None


self.right = None


self.val = key

def insert(root, key):


if root is None:


return TreeNode(key)


else:


if root.val < key:


root.right = insert(root.right, key)


else:


root.left = insert(root.left, key)


return root

创建一个空的二叉搜索树


root = None

插入节点


root = insert(root, 50)


root = insert(root, 30)


root = insert(root, 20)


root = insert(root, 40)


root = insert(root, 70)


root = insert(root, 60)


root = insert(root, 80)


三、平衡树插入

平衡树是一种特殊的二叉树,它通过旋转操作保持树的平衡,从而保证树的高度最小。常见的平衡树有AVL树和红黑树。本文以AVL树为例,介绍平衡树的插入操作。

AVL树的插入操作如下:

1. 按照二叉搜索树的插入方法插入节点。

2. 更新每个节点的平衡因子(左子树高度减去右子树高度)。

3. 如果某个节点的平衡因子绝对值大于1,则进行相应的旋转操作以恢复平衡。

以下是一个AVL树插入操作的Python代码示例:

python

class AVLNode:


def __init__(self, key):


self.left = None


self.right = None


self.val = key


self.height = 1

def get_height(node):


if not node:


return 0


return node.height

def update_height(node):


node.height = max(get_height(node.left), get_height(node.right)) + 1

def get_balance(node):


if not node:


return 0


return get_height(node.left) - get_height(node.right)

def rotate_right(y):


x = y.left


T2 = x.right


x.right = y


y.left = T2


update_height(y)


update_height(x)


return x

def rotate_left(x):


y = x.right


T2 = y.left


y.left = x


x.right = T2


update_height(x)


update_height(y)


return y

def insert(node, key):


if not node:


return AVLNode(key)


if key < node.val:


node.left = insert(node.left, key)


else:


node.right = insert(node.right, key)


update_height(node)


balance = get_balance(node)


if balance > 1 and key < node.left.val:


return rotate_right(node)


if balance < -1 and key > node.right.val:


return rotate_left(node)


if balance > 1 and key > node.left.val:


node.left = rotate_left(node.left)


return rotate_right(node)


if balance < -1 and key < node.right.val:


node.right = rotate_right(node.right)


return rotate_left(node)


return node

创建一个空的AVL树


root = None

插入节点


root = insert(root, 10)


root = insert(root, 20)


root = insert(root, 30)


root = insert(root, 40)


root = insert(root, 50)


root = insert(root, 25)


四、总结

本文介绍了二叉树的插入操作,包括二叉搜索树和平衡树的插入。通过代码示例,我们了解了二叉搜索树和AVL树的插入过程,以及如何通过旋转操作保持树的平衡。这些知识对于理解和应用二叉树数据结构具有重要意义。

在实际应用中,选择合适的二叉树结构取决于具体的需求。二叉搜索树简单易实现,但性能可能不如平衡树;平衡树性能更优,但实现较为复杂。在实际应用中,我们需要根据具体场景选择合适的数据结构。