平衡二叉树的时间复杂度

目录

一、知识补充

二、定义

三、推导过程


一、知识补充

一般认为,对于只有一个结点的树,那么这个结点的高度为0,以此类推,有L层的树根结点的高度h=L-1。

二、定义

平衡二叉树的定义为,任意一个结点,其左子树和右子树的平衡因子绝对值不大于1。最小的结点数并非2^{k},而是一组满足类似斐波那契数列的函数。

三、推导过程

当h=0时,最小结点数为1。最小结点数n_{h}=n_{h-1}+n_{h-2}+1(找规律得到的)。满足斐波那契数列,并可写成n_h=F(h+2)-1

对于斐波那契数列,有

F_i\approx \frac{1}{\sqrt{5}}\left ( \frac{1+\sqrt{5}}{2} \right )^{i}

n_h\approx \frac{1}{\sqrt{5}}\left ( \frac{1+\sqrt{5}}{2} \right )^{h+2}-1

最后

h=O(logn)

平衡二叉树(Balanced Binary Tree),也被称为自平衡二叉搜索树,常见的有AVL树和红黑树等。这种数据结构通过保持树的高度尽可能小来确保操作的时间复杂度。 ### 平衡二叉树时间复杂度 - **插入**:O(log n) - **删除**:O(log n) - **查找**:O(log n) 平衡二叉树的这些操作之所以能保持在O(log n)的时间复杂度内完成,是因为它总是维持着树的高度在一个较小的范围内,具体来说,高度h与节点数n的关系大致为h = O(log n)。 以下是一个简单的Python实现AVL树的例子: ```python class TreeNode: def __init__(self, key): self.left = None self.right = None self.val = key self.height = 1 class AVLTree: def insert(self, root, key): if not root: return TreeNode(key) elif key < root.val: root.left = self.insert(root.left, key) else: root.right = self.insert(root.right, key) root.height = 1 + max(self.getHeight(root.left), self.getHeight(root.right)) balance = self.getBalance(root) # 左左情况 if balance > 1 and key < root.left.val: return self.rightRotate(root) # 右右情况 if balance < -1 and key > root.right.val: return self.leftRotate(root) # 左右情况 if balance > 1 and key > root.left.val: root.left = self.leftRotate(root.left) return self.rightRotate(root) # 右左情况 if balance < -1 and key < root.right.val: 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) # 使用例子 avl_tree = AVLTree() root = None root = avl_tree.insert(root, 10) root = avl_tree.insert(root, 20) root = avl_tree.insert(root, 30) ``` 上述代码中`AVLTree`类实现了基本的AVL树插入功能。每次插入后都会检查并调整树的平衡性,以确保所有操作都能在O(log n)时间内完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hymannnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值