替罪羊树
替罪羊树是一种自平衡的变量
替罪羊树背后的直觉是我们都必须面对的。当事情出错时,我们需要责备替罪羊。一旦我们找到了替罪羊,就可以让他们去处理问题了。插入之后,替罪羊找到一个子树不平衡的节点。这就是替罪羊。然后,这个替罪羊的子树被重新平衡。
替罪羊树的实现非常灵活。可以以删除和查找为代价对插入进行优化,反之亦然。程序员可以根据自己特定的应用程序定制替罪羊树的实现,使这个数据结构非常有吸引力。
我们找到插入替罪羊的过程很简单。在下面的gif中,树一开始是平衡的。当插入一个新的节点12时,树就变得不平衡了。从新插入的节点开始,我们检查该节点的子树根,看看它是否平衡。如果是的话,我们去找家长重复一遍。最终,我们要么找到一个替罪羊,它的子树是不平衡的,要么在根节点结束,而树仍然是平衡的。在本例中,节点8有一棵不平衡的子树,所以它是我们的替罪羊。
属性
首先是替罪羊树 替罪羊树只存储以下属性 替罪羊树中的每个节点只有以下属性。
财产
函数
大小
树中的节点数。
根
指向树根的指针。
max_size
自上次完全重建以来树的最大大小。
财产
函数
关键
节点的值。
左
指向节点左子节点的指针。
正确的
指向节点右子节点的指针。
操作
替罪羊树只处理两个操作:插入和删除。树的查找和遍历是完全相同的
插入
插入过程开始时与二叉搜索树相同。新节点的适当位置通过 现在,树需要知道它是否需要重新平衡。它通过查找新节点的祖先来找到其子树不平衡的第一个节点。一棵树是否平衡通常是其权重属性的一个因素 重新平衡植根于替罪羊的树的实际过程 这是因为,在我们重新构建给定节点的子树根之前
删除实际上比在替罪羊树中插入更容易。这棵树就是在这里使用这块土地的 当我们从替罪羊树中删除一个节点时,该树将检查是否删除
复杂性
替罪羊树的复杂性与其他树非常相似
参见:
大O符号 .
平均 | |
空间* * | |
搜索 | |
遍历 | * |
插入 | * |
删除 | * |
*平摊分析
但比其他的自我平衡更好
Python实现
下面的python实现旨在阐明替罪羊树的一些进程。插入的过程已经列出,但是为了简洁起见省略了删除。
注意:在这个实现中,对基本结构做了一些修改,以使内容更清晰。具体来说,所有节点都指向它们的父节点,以使代码更具可读性。然而,通过跟踪所有父节点,可以很容易地忽略这一点。
两个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
|