Michael ilkanayev
Michael ilkanayev

Reputation: 116

Building a tree in python with tuple

I get the following tuple :(12, (6, (2,), (8,)), (15, (14,), (18,))) and I need to return an instance of Tree in the Following form : Tree(12, Tree(6, Tree(2), Tree(8)), Tree(15, Tree(14), Tree(18)))

My class is :

class Tree():
    def __init__(self, entry, left=None, right=None):
        self.entry = entry
        self.left = left
        self.right = right
    def __repr__(self):
        if not self.left and not self.right:
            return "Tree({0})".format(repr(self.entry))
        return "Tree({0},{1},{2})".format(repr(self.entry),repr(self.left),repr(self.right))

The problem that I can not understand is why it does not enter to the base condition? And how can I fix the function.

The function I did is:

def build_tree(tree):
    if type(tree) != tuple:
        return Tree(tree)
    return Tree(tree[0], build_tree(tree[1]), build_tree(tree[2]))

The activation is :

tree1 = (12, (6, (2,), (8,)), (15, (14,), (18,)))
t1=build_tree(tree1)
print(t1)

Upvotes: 0

Views: 706

Answers (3)

Helios
Helios

Reputation: 715

You want isinstance

def build_tree(tree):
    if isinstance(tree, tuple):
        if len(tree) == 1:
            return Tree(tree[0])
        return Tree(tree[0], build_tree(tree[1]), build_tree(tree[2]))
    return Tree(tree)
print(build_tree((12, (6, 2, 8), (15, 14, 18))))

Upvotes: -1

trincot
trincot

Reputation: 351369

As the innermost tuples just have one member, avoid using an index that is out of range and just slice out whatever there is as tuple members after the node value, and map those to your function.

So replace the last return statement in your build_tree function with this:

return Tree(tree[0], *map(build_tree, tree[1:]))

Upvotes: 2

Mulan
Mulan

Reputation: 135415

The problem is tree[1] and tree[2] are sometimes unset for entries like (2,) or (8,). This will result in an IndexError. A workaround is to "pad" the tuple with (None, None) values and then trim down to 3 elements -

def build_tree(a):
  if a:
    (entry, left, right) = (a + (None, None))[:3]
    return Tree(entry, build_tree(left), build_tree(right))
  else:
    return None
x = (12, (6, (2,), (8,)), (15, (14,), (18,)))
mytree = build_tree(x)
print(mytree)
Tree(12,Tree(6,Tree(2),Tree(8)),Tree(15,Tree(14),Tree(18)))

I will remark a functional approach with a thin class wrapper will make it easier for you to grow the functionality of your tree. For more information on this technique, see this related Q&A.

Upvotes: 0

Related Questions