平衡二叉树的建立(下)

在理解了几种基本类型之后,我们就要知道怎么用4个基础操作了

node *insert(node *root, int val) {
    if(root == NULL) {
        root = new node();
        root->val = val;
        root->left = root->right = NULL;
    } else if(val < root->val) {
        root->left = insert(root->left, val);
        if(getHeight(root->left) - getHeight(root->right) == 2)
            root = val < root->left->val ? rotateRight(root) : rotateLeftRight(root);
    } else {
        root->right = insert(root->right, val);
        if(getHeight(root->left) - getHeight(root->right) == -2)
            root = val > root->right->val ? rotateLeft(root) : rotateRightLeft(root);
    }
    return root;
}

首先我们要有一个计算高度的函数getHeight(node*);

树的算法大部分都是递归的,我们很喜欢这样做,但是如果稍微递归的复杂那么一点,可能就不那么直观了。

其实好好看看,也不难理解,就是判断插入点与当前根节点的大小关系,这里形成递归。

然后就是要判断这个操作会不会使得当前根节点的子树不平衡,如果不平衡,那么判断属于4种类型中的哪一种;这4种在开始判断插入点与当前点的大小关系时已经分成两类了,就是L-L,L-R型 R-R,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代码片段提供了一个基本框架用来说明如何在一个典型的二叉搜索树内定位指定的关键字。当然针对不同类型的平衡树可能会存在些许差异但是核心思路是一致的即利用好内部固有顺序完成快速检索任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值