欢迎访问宙启技术站
智能推送

python怎么创建平衡二叉树

发布时间:2023-05-16 14:02:20

平衡二叉树(AVL树)是一种非常常见的数据结构,它具有高效的查找、插入和删除操作。为了创建一个平衡二叉树,需要了解平衡二叉树的定义、性质以及实现方式。

1. 平衡二叉树的定义

平衡二叉树是一种特殊的二叉搜索树,它具有以下性质:

- 对于任意一个节点,左子树和右子树的高度差不超过1。

- 平衡二叉树的左子树和右子树也是平衡二叉树。

平衡二叉树的定义保证了它具有平衡性,即它的左右子树的高度差不超过1,这使得它的查找、插入和删除操作具有良好的时间复杂度。

2. 实现方式

实现平衡二叉树可以采用递归和非递归两种方法。其中,递归方法比非递归方法更简单易懂,但非递归方法的效率更高。

2.1 递归方法

创建平衡二叉树的递归方法通常包括以下步骤:

- 首先,创建一个新节点,将要插入的数据存储在该节点中。

- 然后,将该节点插入到二叉搜索树中,如果二叉搜索树为空,则该节点作为根节点。

- 接下来,检查根节点的左子树和右子树的高度差是否超过1,如果超过1,则需要进行平衡操作。平衡操作通常分为四种情况:LL、RR、LR和RL,具体操作方法见下面的代码片段。

- 最后,递归地处理左子树和右子树,直到所有节点插入完毕。

以下是使用递归方法创建平衡二叉树的代码示例:

class AVLNode:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
        self.height = 1
 
class AVLTree:
    def insert(self, root, data):
        if not root:
            return AVLNode(data)
        elif data < root.data:
            root.left = self.insert(root.left, data)
        else:
            root.right = self.insert(root.right, data)
 
        root.height = 1 + max(self.getHeight(root.left),
                              self.getHeight(root.right))
 
        balance = self.getBalance(root)
 
        if balance > 1 and data < root.left.data:
            return self.rightRotate(root)
 
        if balance < -1 and data > root.right.data:
            return self.leftRotate(root)
 
        if balance > 1 and data > root.left.data:
            root.left = self.leftRotate(root.left)
            return self.rightRotate(root)
 
        if balance < -1 and data < root.right.data:
            root.right = self.rightRotate(root.right)
            return self.leftRotate(root)
 
        return root
 
    def leftRotate(self, z):
        y = z.right
        T2 = y.left
        y.left = z
        z.right = T2
 
        z.height = 1 + max(self.getHeight(z.left),
                           self.getHeight(z.right))
        y.height = 1 + max(self.getHeight(y.left),
                           self.getHeight(y.right))
 
        return y
 
    def rightRotate(self, z):
        y = z.left
        T3 = y.right
        y.right = z
        z.left = T3
 
        z.height = 1 + max(self.getHeight(z.left),
                           self.getHeight(z.right))
        y.height = 1 + max(self.getHeight(y.left),
                           self.getHeight(y.right))
 
        return y
 
    def getHeight(self, root):
        if not root:
            return 0
 
        return root.height
 
    def getBalance(self, root):
        if not root:
            return 0
 
        return self.getHeight(root.left) - self.getHeight(root.right)

2.2 非递归方法

非递归方法的实现方式通常使用栈来模拟递归过程。具体方法如下:

- 首先,创建一个新节点,将要插入的数据存储在该节点中。

- 然后,将创建的节点插入到二叉搜索树中,如果二叉搜索树为空,则该节点作为根节点。

- 接下来,检查根节点的左子树和右子树的高度差是否超过1,如果超过1,则需要进行平衡操作。平衡操作通常分为四种情况:LL、RR、LR和RL,具体操作方法见下面的代码片段。

- 最后,利用栈模拟递归过程,逐个处理每个节点,直到所有节点插入完毕。

以下是使用非递归方法创建平衡二叉树的代码示例:

class AVLNode:
    def __init__(self, data=0, height=1, left=None, right=None):
        self.data = data
        self.height = height
        self.left = left
        self.right = right
 
class AVLTree:
    def insert(self, root, data):
        stack = []
        if not root:
            return AVLNode(data=data)
        stack.append(root)
        while stack:
            curr = stack.pop()
            if data < curr.data:
                if not curr.left:
                    curr.left = AVLNode(data=data)
                else:
                    stack.append(curr.left)
            else:
                if not curr.right:
                    curr.right = AVLNode(data=data)
                else:
                    stack.append(curr.right)
 
            curr.height = 1 + max(self.getHeight(curr.left),
                                       self.getHeight(curr.right))
 
            balance = self.getBalance(curr)
 
            if balance > 1 and data < curr.left.data:
                return self.rightRotate(curr)
 
            if balance < -1 and data > curr.right.data:
                return self.leftRotate(curr)
 
            if balance > 1 and data > curr.left.data:
                curr.left = self.leftRotate(curr.left)
                return self.rightRotate(curr)
 
            if balance < -1 and data < curr.right.data:
                curr.right = self.rightRotate(curr.right)
                return self.leftRotate(curr)
 
        return root
 
    def leftRotate(self, z):
        y = z.right
        T2 = y.left
        y.left = z
        z.right = T2
 
        z.height = 1 + max(self.getHeight(z.left),
                           self.getHeight(z.right))
        y.height = 1 + max(self.getHeight(y.left),
                           self.getHeight(y.right))
 
        return y
 
    def rightRotate(self, z):
        y = z.left
        T3 = y.right
        y.right = z
        z.left = T3
 
        z.height = 1 + max(self.getHeight(z.left),
                           self.getHeight(z.right))
        y.height = 1 + max(self.getHeight(y.left),
                           self.getHeight(y.right))
 
        return y
 
    def getHeight(self, root):
        if not root:
            return 0
 
        return root.height
 
    def getBalance(self, root):
        if not root:
            return 0
 
        return self.getHeight(root.left) - self.getHeight(root.right)

以上就是创建平衡二叉树的详细介绍和代码示例。