Algorithm 每个节点仅使用1个额外位实现平衡因子

Algorithm 每个节点仅使用1个额外位实现平衡因子,algorithm,avl-tree,Algorithm,Avl Tree,在《算法导论-创造性方法》一书中,问题4.18: 第4.3.4节中介绍的AVL算法需要具有三个可能值的平衡因子:1、0或-1。要表示三个值,我们需要2位。建议一种实现这些算法的方法(只需稍加修改),每个节点只需额外1位 我通过记录每个节点的高度而不是平衡因子来实现AVL树 但我不知道如何仅用1位表示三个值(1,0,-1)。我想肯定还有其他一些信息可以用来表示1,0,-1,以及1位 有人能帮我解答这个问题吗?减去高度,int balance=left->height-right->height,然

在《算法导论-创造性方法》一书中,问题4.18:

第4.3.4节中介绍的AVL算法需要具有三个可能值的平衡因子:1、0或-1。要表示三个值,我们需要2位。建议一种实现这些算法的方法(只需稍加修改),每个节点只需额外1位


我通过记录每个节点的高度而不是平衡因子来实现AVL树

但我不知道如何仅用1位表示三个值(1,0,-1)。我想肯定还有其他一些信息可以用来表示1,0,-1,以及1位

有人能帮我解答这个问题吗?

减去高度,
int balance=left->height-right->height
,然后使用
balance=1
。除了高度之外,不需要额外的位

在每个节点中保留一个表示“此子树的高度低于其同级树”的位。节点上的平衡因子与其子节点中的额外位之间存在1:1的对应关系

left: 0, right: 0 <-> balance: 0
left: 0, right: 1 <-> balance: 1
left: 1, right: 0 <-> balance: -1
left: 1, right: 1 <-> invalid
左:0,右:0余额:0
左:0,右:1余额:1
左:1,右:0余额:-1
左:1,右:1无效

如果节点没有两个子节点,您可以计算它
否则你可以在儿子身上记住它:左儿子一个,右儿子一个。

不要把你的大脑停留在-1,0和1上。释放你的创造力。你可以选择或<+>=:)如果使用>=和<>,我如何在以下情况下确定树是否平衡:R的平衡因子为“>=”,在将节点a插入到R的左子树后,R是否平衡?以及,否,不能用一个位表示三个不同的值。我通过记录每个节点的高度而不是平衡因子来实现AVL树。但“高度”至少占用8位,这需要一些时间来纠正。当高度发生变化时,平衡会影响节点的行为:通过实例变形,可以在每个节点的类中保持平衡。