2-3-4树的层序打印

接前面

红黑树转2-3-4树打印失败的地方。

0到100

这个是应该的样子

>>> rb = RBT()
>>> for k in range(100):
	rb.INSERT(k)	
>>> t=tree234(rb.root)
>>> t.print()
结点类型和值(4, [15, 31, 47])
结点类型和值(4, [3, 7, 11])
结点类型和值(4, [19, 23, 27])
结点类型和值(4, [35, 39, 43])
结点类型和值(3, [63, 71])
结点类型和值(4, [0, 1, 2])
结点类型和值(4, [4, 5, 6])
结点类型和值(4, [8, 9, 10])
结点类型和值(4, [12, 13, 14])
结点类型和值(4, [16, 17, 18])
结点类型和值(4, [20, 21, 22])
结点类型和值(4, [24, 25, 26])
结点类型和值(4, [28, 29, 30])
结点类型和值(4, [32, 33, 34])
结点类型和值(4, [36, 37, 38])
结点类型和值(4, [40, 41, 42])
结点类型和值(4, [44, 45, 46])
结点类型和值(4, [51, 55, 59])
结点类型和值(4, [65, 67, 69])
结点类型和值(3, [79, 87])
结点类型和值(4, [48, 49, 50])
结点类型和值(4, [52, 53, 54])
结点类型和值(4, [56, 57, 58])
结点类型和值(4, [60, 61, 62])
结点类型和值(2, [64])
结点类型和值(2, [66])
结点类型和值(2, [68])
结点类型和值(2, [70])
结点类型和值(4, [73, 75, 77])
结点类型和值(3, [81, 83])
结点类型和值(3, [91, 95])
结点类型和值(2, [72])
结点类型和值(2, [74])
结点类型和值(2, [76])
结点类型和值(2, [78])
结点类型和值(2, [80])
结点类型和值(2, [82])
结点类型和值(4, [84, 85, 86])
结点类型和值(4, [88, 89, 90])
结点类型和值(3, [92, 93])
结点类型和值(3, [97, 98])
结点类型和值(2, [94])
结点类型和值(2, [96])
结点类型和值(2, [99])
>>> 

与B树比较

234树应该里应该尽量是4结点再3结点再2结点。
在这里插入图片描述

0到50

当时遇到一个红结点两个黑结点的情况,现在是把它当成3结点右斜(黑红)处理。
可以看到23后面的点是(3, [31, 39]),除了最后的49,其他的红结点都是这样处理的。

结点类型和值(4, [7, 15, 23])
结点类型和值(4, [1, 3, 5])
结点类型和值(4, [9, 11, 13])
结点类型和值(4, [17, 19, 21])
结点类型和值(3, [31, 39])
结点类型和值(2, [0])
结点类型和值(2, [2])
结点类型和值(2, [4])
结点类型和值(2, [6])
结点类型和值(2, [8])
结点类型和值(2, [10])
结点类型和值(2, [12])
结点类型和值(2, [14])
结点类型和值(2, [16])
结点类型和值(2, [18])
结点类型和值(2, [20])
结点类型和值(2, [22])
结点类型和值(4, [25, 27, 29])
结点类型和值(3, [33, 35])
结点类型和值(3, [43, 45])
结点类型和值(2, [24])
结点类型和值(2, [26])
结点类型和值(2, [28])
结点类型和值(2, [30])
结点类型和值(2, [32])
结点类型和值(2, [34])
结点类型和值(4, [36, 37, 38])
结点类型和值(4, [40, 41, 42])
结点类型和值(2, [44])
结点类型和值(3, [47, 48])
结点类型和值(2, [46])
结点类型和值(2, [49])

镜像

如果从50到0插入呢,通过当前结点是左支还是右支判断区别。

结点类型和值(4, [27, 35, 43])
结点类型和值(3, [11, 19])
结点类型和值(4, [29, 31, 33])
结点类型和值(4, [37, 39, 41])
结点类型和值(4, [45, 47, 49])
结点类型和值(3, [5, 7])
结点类型和值(3, [15, 17])
结点类型和值(4, [21, 23, 25])
结点类型和值(2, [28])
结点类型和值(2, [30])
结点类型和值(2, [32])
结点类型和值(2, [34])
结点类型和值(2, [36])
结点类型和值(2, [38])
结点类型和值(2, [40])
结点类型和值(2, [42])
结点类型和值(2, [44])
结点类型和值(2, [46])
结点类型和值(2, [48])
结点类型和值(2, [50])
结点类型和值(3, [2, 3])
结点类型和值(2, [6])
结点类型和值(4, [8, 9, 10])
结点类型和值(4, [12, 13, 14])
结点类型和值(2, [16])
结点类型和值(2, [18])
结点类型和值(2, [20])
结点类型和值(2, [22])
结点类型和值(2, [24])
结点类型和值(2, [26])
结点类型和值(2, [1])
结点类型和值(2, [4])

代码更新

1, if rbt.color == BLACK and rbt.left == None and rbt.right == None:#2
去掉rbt.color == BLACK的判断,要考虑红叶子结点。
2,把#4(红黑红)和#4(黑黑黑)放到3结点,#3右斜(黑红)和#3左斜(红黑)的前面,不然后面把前面的拦截了。
3,node_234(list((rbt.left.val,rbt.val)),3,#左小要放前面,当时写反了。
4,添加‘黑红黑’的左右支情况。

随机测试

>>> import random
>>> rb = RBT()
>>> for k in  random.sample(range(100000),99):
	rb.INSERT(k)	
>>> t=tree234(rb.root)
>>> t.print()
结点类型和值(3, [37155, 59069])
结点类型和值(4, [12929, 23475, 25740])
结点类型和值(3, [44957, 48827])
结点类型和值(4, [60793, 69773, 82895])
结点类型和值(4, [2975, 6517, 8236])
结点类型和值(3, [15486, 17797])
结点类型和值(4, [23885, 24214, 24747])
结点类型和值(3, [28381, 30356])
结点类型和值(3, [39651, 43069])
结点类型和值(4, [46605, 47182, 47474])
结点类型和值(3, [54765, 56374])
结点类型和值(4, [59207, 59298, 60172])
结点类型和值(3, [67038, 67509])
结点类型和值(4, [70951, 76403, 80565])
结点类型和值(4, [85246, 89183, 99559])
结点类型和值(3, [2015, 2940])
结点类型和值(2, [3233])
结点类型和值(3, [7279, 7305])
结点类型和值(4, [10137, 10770, 12349])
结点类型和值(3, [13127, 14182])
结点类型和值(3, [15595, 17762])
结点类型和值(2, [19333])
结点类型和值(2, [24638])
结点类型和值(4, [26814, 27163, 27712])
结点类型和值(2, [29040])
结点类型和值(4, [30651, 31620, 31997])
结点类型和值(4, [37853, 38546, 39640])
结点类型和值(3, [40435, 40818])
结点类型和值(3, [43293, 43603])
结点类型和值(2, [46608])
结点类型和值(2, [47470])
结点类型和值(4, [50051, 50742, 53706])
结点类型和值(2, [55760])
结点类型和值(4, [58519, 58749, 58813])
结点类型和值(2, [59297])
结点类型和值(2, [60716])
结点类型和值(3, [62825, 66193])
结点类型和值(2, [67276])
结点类型和值(3, [68954, 69052])
结点类型和值(2, [70860])
结点类型和值(4, [72005, 72836, 73648])
结点类型和值(4, [77115, 77639, 80052])
结点类型和值(2, [82452])
结点类型和值(4, [83566, 84689, 84816])
结点类型和值(4, [86785, 86945, 87291])
结点类型和值(3, [91156, 94910])
结点类型和值(2, [99828])

后话

测试红黑树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值