A bit of a newbie to computing science.
I have the basics for a binary tree in Python and I was studying some of the applications in an AVL tree:
class TreeBinary: def __init__(self, data): self.data = data self.left = None self.right = None def show_aux(root): if not root: return '' string = str(root.data) if root.left or root.right: string += ' (' + show_aux(root.left) + ')' # Space before '(' else: string += ' (' # Space before '(' string += ')' if root.right: string += ' (' + show_aux(root.right) + ')' # Space before '(' else: string += ' (' # Space before '(' string += ')' return string def show(root): print('(' + show_aux(root) + ')') def rotate_left(root): rotated_root = root.right try: temp = rotated_root.left except: show(root) rotated_root.left = root root.right = temp return rotated_root root = TreeBinary('a') root.left = TreeBinary('b') root.right = TreeBinary('c') show(root) print() root.left = rotate_left(root.left) show(root)
One of the challenges I’m trying to solve is to rotate the left side of a tree in a function that takes the root as a parameter, but I’m getting the following error:
root.left = rotate_left(root.left) File "rotated_left_binary_tree.py", line 36, in rotate_left rotated_root.left = root AttributeError: 'NoneType' object has no attribute 'left'
I tried to solve, but it only prints the root and the right root
Advertisement
Answer
You are rotating the subtree at b
, but your function expects the given node to have a right child, which obviously is not the case: there is nothing to rotate at b
.
It would have made more sense if your main code would have asked for a rotation at node a
:
root = rotate_left(root)
On the other hand, it would be good to protect your rotate functions a bit. Let it return the root unchanged when it has no right child:
def rotate_left(root): rotated_root = root.right if not rotated_root: return root # cannot rotate here try: temp = rotated_root.left except: show(root) rotated_root.left = root root.right = temp return rotated_root
Now your original main code would not trigger an exception, but the tree would also not change — which is indeed the correct behaviour when you call the rotation function on a leaf node (b
).