平衡二叉树的建立(上)

  关于平衡二叉树的理解有一些博客了,但是我觉得不能很好地理解总是有一些原因的,我自己就代表了一种开始不能理解的原因,所以从自己理解时碰到的问题来解释下,也加深下自己的印象。

 

感觉好难讲清楚。。如果有相关视频就好了,就像把一个数学公式用文字表达出来,会变得非常难以理解。

几种基础类型

  一共4种类型,分别是L-L,L-R,R-R,R-L型,一定要对这个有一个画面式的理解,因为我们不可能背代码,这4种基础类型就是我们复现代码的最好的依据。这图是我自己画的。。。

以下图来解释L-R型的意思(其他3种类似)

      1在3的左边(Left),2在1的右边(Right),故称为L-R型

 

 

在知道这4种类型后,我们先从简单类型入手,也就是L-L和R-R型

L-L型,直接对3进行右旋操作

 

先解释下右旋的直观理解,就是3绕着2顺时针旋转。(父节点绕着子节点顺时针旋转)

同样,对于R-R型,左旋就是1绕着2逆时针旋转。(父节点绕着子节点逆时针旋转)

node *rotateRight(node *root) {
    node *t = root->left;
    root->left = t->right;//托付2的右儿子
    t->right = root;
    return t;
}

直观的看到,2的右儿子成了3,要是2本来没有2儿子还好,如果2本来有右儿子怎么办呢?这是矛盾1;

3本来是有左儿子的,那么现在没了,3岂不是很难过???这是矛盾2;

马克思主义说过矛盾可以同归于尽,这里我们来感受下马克思主义哲学的优越性。。。

2多个右儿子,3少个左儿子,怎么办呢,2和3一拍即合,2把多出来的右儿子托付给3儿子,真的是2333333

当然了,这只是为了便于理解,但是我们可以发现,这样子也是符合线索二叉树的,因为2的右儿子必然比3小,当3的左儿子不亏。

总结:关键要理解这里的托付儿子这一步。

这里左旋也一样,本来1有右儿子,现在好像没了;2本来如果有个左儿子,那这里被1换后就多出来个左儿子;

那么,2就把多出来的左儿子拿出来当1的右儿子。

这是先左旋3的左子树1,形成我们已经解决的L-L型,然后再右旋2节点。

node *rotateLeftRight(node *root) {
    root->left = rotateLeft(root->left);
    return rotateRight(root);
}

 

 

R-L型类似了。

### 平衡二叉树的实现 #### 建立平衡二叉树 为了保持二叉搜索树的高度尽可能低,从而提高查找效率,在构建过程中需要维持一定的平衡条件。红黑树是一种自平衡二叉搜索树,其通过特定的颜色属性来确保任何路径上不会有过长的情况发生[^4]。 ```cpp template <typename Key, typename Value> class RedBlackBST { private: static const bool RED = true; static const bool BLACK = false; struct Node { Key key; Value val; Node* left; Node* right; int N; bool color; Node(Key k, Value v, int n, bool c):key(k),val(v),left(NULL), right(NULL),N(n),color(c){} }; public: void put(const Key& key, const Value& value); }; ``` 这段代码展示了红黑树节点定义的一部分以及`put()`方法声明用于插入新键值对。实际应用中还需要实现旋转、颜色翻转等辅助函数以维护性质。 #### 插入操作 当向已有的红黑树中添加新的元素时,会先按照标准二叉搜索树的方式找到合适的位置并创建一个新的红色链接指向该结点;之后再调整可能破坏了红黑特性的部分——这通常涉及到重新着色与旋转动作。由于过程较为复杂,具体细节建议查阅专门资料获取更深入理解。 #### 查找操作 对于已经建好的平衡二叉树来说,执行查找非常简单高效。只需从根部开始比较目标关键字同当前访问到的结点所含关键字大小关系决定下一步往左子树还是右子树前进直到发现匹配项或到达叶子位置为止。这种基于有序排列特性而设计出来的遍历方式能够保证O(logn)级别的性能表现[^1]。 ```python def search(root, target): while root != None and target != root.key: if target < root.key: root = root.left else: root = root.right return root ``` 上述Python代码片段提供了一个基本框架用来说明如何在一个典型的二叉搜索树内定位指定的关键字。当然针对不同类型的平衡树可能会存在些许差异但是核心思路是一致的即利用好内部固有顺序完成快速检索任务。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值