Please explain why this Python code is not working. When I run the file, this appears: “TypeError: ‘node’ object is not callable” for lines referring to self.count(curr_node.get_left()) and if curr_node.right() is not None:
The instructions are also included for background.
instructions
One way of determining if a tree is well balanced is to count how many of the nodes
have zero children, one child, or two children. Well-balanced trees will have very few
nodes with just one child. A degenerate tree will have all nodes with one child, except the
very last node which will have zero children.
Writethe function count() which will count the occurrences of nodes with zero, one, or two
children. You may only edit the count() function. No other edits are permissable.
There are three test cases. The first two are simple enough that you can manually validate
your results. The third cases reads 1000 randomly generated ints out of a file and puts them
in the tree. My results are:
Nodes with 0 children: 345
Nodes with 1 children: 311
Nodes with 2 children: 344
Your code should return the same. Is this a well-balanced tree? If the tree was _perfectly_ balanced,
what would the node counts be?
import sys
class node:
def __init__(self,val):
self.payload = val
self.left = None
self.right = None
def set_left(self, ptr):
self.left = ptr
def set_right(self,ptr):
self.right = ptr
def get_val(self): return self.payload
def get_left(self): return self.left
def get_right(self): return self.right
class tree:
def __init__(self):
self.root = None
self.cnt_0 , self.cnt_1 , self.cnt_2 = 0 , 0 , 0
def insert(self,val):
new_node = node(val)
curr_node = self.root
if curr_node is None:
self.root = new_node
return
while True:
if val < curr_node.get_val(): if curr_node.get_left() is None: curr_node.set_left(new_node) return else: curr_node = curr_node.get_left() else: if curr_node.get_right() is None: curr_node.set_right(new_node) return else: curr_node = curr_node.get_right() def count(self,curr_node = None): ''' WRITE THIS FILE THE GOAL IS TO COUNT HOW MANY NODES HAVE ZERO, ONE, OR TWO CHILD NODES STORE YOUR RESULT IN CNT_0, CNT_1, and CNT_2 (MEMBER VARS OF THE TREE CLASS) ''' if (curr_node == None): # if count is called without an input var, curr_node will be None # which means count is being called directly from testcase (not recursively). # in this case, init curr_node to root and set the count values = 0 curr_node = self.root self.cnt_0 , self.cnt_1 , self.cnt_2 = 0 , 0 , 0 if (curr_node == None): return if curr_node.get_left() is None and curr_node.get_right() is None: self.cnt_0 += 1 elif curr_node.get_left() is not None and curr_node.get_right() is not None: self.cnt_2 += 1 else: self.cnt_1 += 1 if curr_node.get_left() is not None: self.count(curr_node.get_left()) if curr_node.right() is not None: self.count(curr_node.get_right()) def print_count(self): print("Nodes with 0 children: " , self.cnt_0) print("Nodes with 1 children: " , self.cnt_1) print("Nodes with 2 children: " , self.cnt_2) print("") def testcase_0(): print("\nTestcase 0") print("---------------") x = tree() x.insert(8) x.insert(6) x.insert(7) x.insert(9) x.count() x.print_count() def testcase_1(): print("\nTestcase 1") print("---------------") x = tree() x.insert(9) x.insert(8) x.insert(7) x.insert(6) x.count() x.print_count() def testcase_2(): print("\nTestcase 2") print("---------------") x = tree() with open("/data/courses/ece_3822/current/lab_05/data.txt") as f: for str in f.readlines(): x.insert( int(str) ) x.count() x.print_count() def main(): testcase_0() testcase_1() testcase_2() if __name__ == "__main__": main()