May-11-2021, 07:58 AM
Quote:Get an error while insert a node to implement tree after insert node values what are missing and where
Error:AttributeError Traceback (most recent call last)
<ipython-input-35-5b7f867f337a> in <module>
228 root = Node(10)
229
--> 230 root.insert(5)
231
232 root.insert(30)
AttributeError: 'Node' object has no attribute 'insert'class Node:
def __init__(self,insert=None, value=None):
self.value = value
self.left = None
self.right = None
def get_value(self):
return self.value
def set_value(self, value):
self.value = value
def has_left_child(self):
return self.left is not None
def get_left_child(self):
return self.left
def set_left_child(self, node):
self.left = node
def has_right_child(self):
return self.right is not None
def get_right_child(self):
return self.right
def set_right_child(self, node):
self.right = node
def _height(self, node, height=0):
if self.root is None:
return 0
return self._height(self.root, 0)
if node is None:
return height
# Increment for this current node.
height += 1
# If this node is a leaf, return the current height.
if not node.has_left_child() and not node.has_right_child():
return height
# To save some steps, we'll only get the child height if there is a child.
left_height = 0
right_height = 0
if node.has_left_child():
left_height = self._height(node.get_left_child(), height)
if node.has_right_child():
right_height = self._height(node.get_right_child(), height)
return max(left_height, right_height)
def _diameter(self, node, diameter=0):
if self.root is None:
return 0
return self._diameter(self.root, 0)
if node is None:
return diameter
left_height = self._height(node.get_left_child())
right_height = self._height(node.get_right_child())
left_diameter = self._diameter(node.get_left_child())
right_diameter = self._diameter(node.get_right_child())
return max(left_height + right_height + 1, max(left_diameter, right_diameter))
tree = Tree()
tree.set_root(9)
tree.get_root().set_left_child(Node(8))
tree.get_root().set_right_child(Node(10))
tree.get_root().get_left_child().set_left_child(Node(7))
tree.get_root().get_right_child().set_right_child(Node(11))
tree.get_root().get_left_child().get_left_child().set_left_child(Node(6))
tree.get_root().get_left_child().get_left_child().set_right_child(Node(5))
tree.get_root().get_left_child().get_left_child().get_right_child().set_right_child(Node(4))
tree.get_root().get_left_child().get_left_child().get_right_child().get_right_child().set_left_child(Node(3))
tree.get_root().get_left_child().get_left_child().get_right_child().get_right_child().set_right_child(Node(2))
tree.get_root().get_left_child().get_left_child().get_right_child().get_right_child().get_right_child().set_right_child(Node(1))
ht = tree.height()
if ht == 7:
print('Yes, the height is 7.')
else:
print('Whoops, wrong height of {}, but should be 7.'.format(ht))
d = tree.diameter()
if d == 9:
print('Yes, the diameter is 9.')
else:
print('Whoops, wrong diameter of {}, but should be 9.'.format(ht))
# depth first seach recurion on BST with some application
class BTree_struct:
def __init__(self, key=None):
self.root = None
self.key = key
self.left = None
self.right = None
def set_root(self, value,key):
self.root = Node(value)
self.key = key
def get_root(self):
return self.root
def diameter(self):
pass
def insert_at_left(self, node):
self.left = node
def insert_at_right(self, node):
self.right = node
def search_elem(self, key):
if self.key == key:
return self
if self.left is not None:
temp = self.left.search(key)
if temp is not None:
return temp
if self.right is not None:
temp = self.right.search(key)
return temp
return None
def dfs(self):
print('entering {}...'.format(self.key))
if self.left is not None:
self.left.dfs()
print('at {}...'.format(self.key))
if self.right is not None:
self.right.dfs()
print('leaving {}...'.format(self.key))
btree_instance = None
print('Menu (no duplicate keys)')
print('insert <data> at root')
print('insert <data> left of <data>')
print('insert <data> right of <data>')
print('dfs')
print('quit')
while True:
my_input = input('What would you like to do? ').split()
op = my_input[0].strip().lower()
if op == 'insert':
data = int(my_input[1])
new_node = BTree_struct(data)
sub_op = my_input[2].strip().lower()
if sub_op == 'at':
btree_instance = new_node
else:
position = my_input[3].strip().lower()
key = int(position)
ref_node = None
if btree_instance is not None:
ref_node = btree_instance.search_elem(key)
if ref_node is None:
print('No such key.')
continue
if sub_op == 'left':
ref_node.insert_at_left(node)
elif sub_op == 'right':
ref_node.insert_at_right(node)
elif op == 'dfs':
print('depth-first search traversal:')
if btree_instance is not None:
btree_instance.dfs()
print()
elif op == 'quit':
break
def insert(self, value):
self.value = value
self.left = None
self.right = None
if value == self.value:
return False
if value:
if value < self.value:
if self.left is None:
self.left = Node(value)
else:
self.left.insert(value)
elif value > self.value:
if self.right is None:
self.right = Node(value)
else:
self.right.insert(value)
else:
self.value = value
"""" 10
/ \
5 30
/ \ / \
8 9 20 40
"""
# alternative way insert node leftsubtree as well rightsuntree
root = Node(10)
root.insert(5)
root.insert(30)
root.insert(20)
root.insert(40)
root.insert(8)
root.insert(9)
