Search code examples
pythonbinary-search-treenodesattributeerror

'int' object has no attribute 'val'


I am having a problem with the following code. I'm trying to find the least common ancestor between two nodes on a binary search tree. The code I have is the following:

def Question4(T, r, p, q):
    s, b = sorted([p.val, q.val])
    while not s <= r.val <= b:
        r = r.left if s <= r.val else r.right
    return r
T = [[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 1],
[0, 0, 0, 0, 0]]
r = 3
p = 1
q = 4
Question4(T, r, p, q)

When I attempt to run this code my terminal output shows AttributeError: 'int' object has no attribute 'val' at this line of code s, b = sorted([p.val, q.val]) I'm not sure whats causing this, I looked up similar answers but could not find a solution. If anyone has any suggestions I would appreciate it.


Solution

  • The variables r p q are all int type and they don't have any attribute val associated with them.

    Now how can you find it. Use dir builtin function.

    >>> r = 3
    >>> dir(r)
    ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
    

    You can see there is no val attribute associated with int object.

    Now, how to fix the above problem.

    def Question4(T, r, p, q):
        s, b = sorted([p, q])  // remove .val
        while not s <= r <= b: // remove .val
            r = r.left if s <= r else r.right // also int doesn't have .right or .left attribute, you need to define your own class to represent this custom data type
        return r
    T = [[0, 1, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [1, 0, 0, 0, 1],
    [0, 0, 0, 0, 0]]
    r = 3                // this is int object which don't have val attribute
    p = 1
    q = 4
    Question4(T, r, p, q)