【发布时间】:2021-12-01 15:52:21
【问题描述】:
我目前正在学习数据结构,但在 AVL 树中遇到了问题
代码:
from myqueue import Queue #my custom queue implimented by linked list
class AVL:
def __init__(self,data):
self.data=data
self.leftnode=self.rightnode=None
self.height=1
def LevelOrderTransversal(self):
if not self:
return
queue=Queue()
queue.enqueue(self)
while not (queue.isempty()):
root=queue.dequeue()
print(root.data)
if root.leftnode is not None:
queue.enqueue(root.leftnode)
if root.rightnode is not None:
queue.enqueue(root.rightnode)
def getheight(rootnode):
if not rootnode:
return 0
return rootnode.height
def getbalance(rootnode):
if not rootnode:
return 0
return getheight(rootnode.leftnode)-getheight(rootnode.rightnode)
def leftrotation(disbalancenode):
rootnode=disbalancenode.rightnode
disbalancenode.rightnode=disbalancenode.rightnode.leftnode
rootnode.leftnode=disbalancenode
disbalancenode.height=1+max(getheight(disbalancenode.leftnode),getheight(disbalancenode.rightnode))
rootnode.height=1+max(getheight(rootnode.leftnode),getheight(rootnode.rightnode))
return rootnode
def rightrotation(disbalancenode):
rootnode=disbalancenode.leftnode
disbalancenode.leftnode=disbalancenode.leftnode.rightnode
rootnode.rightnode=disbalancenode
disbalancenode.height=1+max(getheight(disbalancenode.leftnode),getheight(disbalancenode.rightnode))
rootnode.height=1+max(getheight(rootnode.leftnode),getheight(rootnode.rightnode))
return rootnode
def insertnode(rootnode,nodevalue):
if rootnode.data is None:
return AVL(nodevalue)
elif nodevalue<rootnode.data:
if rootnode.leftnode is None:
rootnode.leftnode=AVL(nodevalue)
else:
insertnode(rootnode.leftnode,nodevalue)
else:
if rootnode.rightnode is None:
rootnode.rightnode=AVL(nodevalue)
else:
insertnode(rootnode.rightnode,nodevalue)
rootnode.height=1+max(getheight(rootnode.leftnode),getheight(rootnode.rightnode))
balance=getbalance(rootnode)
if balance>1 and nodevalue<rootnode.leftnode.data:
return rightrotation(rootnode)
if balance>1 and nodevalue>rootnode.leftnode.data:
rootnode.leftnode=leftrotation(rootnode.leftnode)
return rightrotation(rootnode)
if balance<-1 and nodevalue<rootnode.rightnode.data:
return leftrotation(rootnode)
if balance<-1 and nodevalue>rootnode.rightnode.data:
rootnode.rightnode=rightrotation(rootnode.rightnode)
return leftrotation(rootnode)
return rootnode
A=AVL(5)
A=insertnode(A,10)
A=insertnode(A,15)
A=insertnode(A,20)
A.LevelOrderTransversal()
由于左节点不平衡,所以当我们尝试平衡该节点时,rightrotation() 方法会引发错误
所以错误出现在insertnode()方法中
我得到的错误:
Traceback (most recent call last):
File "c:\Users\Anurag Dabas\Desktop\python\avl tree\newavl.py", line 84, in <module>
A=insertnode(A,15)
File "c:\Users\Anurag Dabas\Desktop\python\avl tree\newavl.py", line 76, in insertnode
rootnode.rightnode=rightrotation(rootnode.rightnode)
File "c:\Users\Anurag Dabas\Desktop\python\avl tree\newavl.py", line 45, in rightrotation
disbalancenode.leftnode=disbalancenode.leftnode.rightnode
AttributeError: 'NoneType' object has no attribute 'rightnode'
我尝试调试但找不到任何东西
这是我的myqueue.py 文件:https://paste-bin.xyz/18851
任何帮助或线索将不胜感激
谢谢
编辑:
目前我的树看起来像:
5
\
10
\
15
\
20
#as you can see it's clearly unbalance so we need leftrotation since it's RR condition
所以左旋转后的结果是这样的:
10
/ \
5 15
\
20
【问题讨论】:
-
您正在尝试访问
disbalancenode.leftnode.rightnode,但disbalancenode.leftnode是None。 -
@JohnGordon 是的,先生,那么如何解决这个问题(我猜轮换的逻辑是正确的,调用轮换的条件也是正确的)
-
如何解决它是不要那样做!如果 disbalancenode.leftnode 为 None,则不要尝试访问 disbalancenode.leftnode.rightnode。
-
@JohnGordon 谢谢先生,我将
disbalancenode.leftnode.rightnode更改为rootnode.leftnode,它正在工作:) -
您在问题底部添加的示例不现实:您一开始就无法到达那棵树,因为它甚至在到达那里之前就已经旋转了。
标签: python data-structures tree avl-tree