From 817c27462bec1a87577cdf91f9cd193253d00554 Mon Sep 17 00:00:00 2001 From: Rafael Date: Tue, 4 Jul 2017 18:46:46 +0200 Subject: [PATCH 1/4] fix some style errors --- data_structures/Binary Tree/binary_seach_tree.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/data_structures/Binary Tree/binary_seach_tree.py b/data_structures/Binary Tree/binary_seach_tree.py index 1f14514b..1dac948a 100644 --- a/data_structures/Binary Tree/binary_seach_tree.py +++ b/data_structures/Binary Tree/binary_seach_tree.py @@ -1,6 +1,8 @@ ''' A binary search Tree ''' + + class Node: def __init__(self, label): @@ -34,7 +36,7 @@ class BinarySearchTree: def insert(self, label): - #Create a new Node + # Create a new Node node = Node(label) @@ -45,7 +47,7 @@ class BinarySearchTree: curr_node = self.root while True: - if curr_node != None: + if curr_node is not None: dad_node = curr_node @@ -61,12 +63,12 @@ class BinarySearchTree: break def empty(self): - if self.root == None: + if self.root is None: return True return False def preShow(self, curr_node): - if curr_node != None: + if curr_node is None: print(curr_node.getLabel(), end=" ") self.preShow(curr_node.getLeft()) From 3ead193f0eb74e92cb6f719b7618b47e89b35fa6 Mon Sep 17 00:00:00 2001 From: Rafael Date: Tue, 4 Jul 2017 18:48:27 +0200 Subject: [PATCH 2/4] Done Node and Insert method --- data_structures/AVL/AVL.py | 106 +++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 data_structures/AVL/AVL.py diff --git a/data_structures/AVL/AVL.py b/data_structures/AVL/AVL.py new file mode 100644 index 00000000..1c59862a --- /dev/null +++ b/data_structures/AVL/AVL.py @@ -0,0 +1,106 @@ +''' +A AVL tree +''' + + +class Node: + + def __init__(self, label): + self.label = label + self.left = None + self.rigt = None + self.parent = None + self.height = 0 + + def getLabel(self): + return self.label + + def setLabel(self, label): + self.label = label + + def getLeft(self): + return self.left + + def setLeft(self, left): + self.left = left + + def getRight(self): + return self.rigt + + def setRight(self, right): + self.rigt = right + + def getParent(self): + return self.parent + + def setParent(self, parent): + self.parent = parent + + def setHeight(self, height): + self.height = height + + def getHeight(self, height): + return self.height + + +class AVL: + + def __init__(self): + self.root = None + self.size = 0 + + # def __init__(self, root): + # self.root = root + # self.size = 1 + + def insert(self, value): + node = Node(value) + if self.root is None: + self.root = node + self.size = 1 + else: + # Same as Binary Tree + dad_node = None + curr_node = self.root + + while True: + if curr_node is not None: + + dad_node = curr_node + + if node.getLabel() < curr_node.getLabel(): + curr_node = curr_node.getLeft() + else: + curr_node = curr_node.getRight() + else: + if node.getLabel() < dad_node.getLabel(): + dad_node.setLeft(node) + dad_node.setHeight(dad_node.getHeight() + 1) + + if (dad_node.getRight().getHeight() - + dad_node.getLeft.getHeight() > 1): + self.rebalance(dad_node) + + else: + dad_node.setRight(node) + dad_node.setHeight(dad_node.getHeight() + 1) + + if (dad_node.getRight().getHeight() - + dad_node.getLeft.getHeight() > 1): + self.rebalance(dad_node) + break + + def rebalance(self, node): + pass + + def rotate_left(self, node): + pass + + def rotate_right(self, node): + pass + + def double_rotate_left(self, node): + pass + + def double_rotate_righs(self, node): + pass From 0b7d3a5c970b59bebb8111dd65d0dd1c8f3ec01a Mon Sep 17 00:00:00 2001 From: Rafael Date: Wed, 5 Jul 2017 20:37:47 +0200 Subject: [PATCH 3/4] Rotate left and right done --- data_structures/AVL/AVL.py | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/data_structures/AVL/AVL.py b/data_structures/AVL/AVL.py index 1c59862a..ab09743e 100644 --- a/data_structures/AVL/AVL.py +++ b/data_structures/AVL/AVL.py @@ -49,10 +49,6 @@ class AVL: self.root = None self.size = 0 - # def __init__(self, root): - # self.root = root - # self.size = 1 - def insert(self, value): node = Node(value) if self.root is None: @@ -91,13 +87,40 @@ class AVL: break def rebalance(self, node): + if (node.getRight().getHeight() - + node.getLeft.getHeight() > 1): + if (node.getRight().getHeight() > + node.getLeft.getHeight()): + pass + else: + pass + pass + elif (node.getRight().getHeight() - + node.getLeft.getHeight() > 2): + if (node.getRight().getHeight() > + node.getLeft.getHeight()): + pass + else: + pass + pass pass def rotate_left(self, node): - pass + # TODO: is this pythonic enought? + aux = node.getLabel() + node = aux.getRight() + node.setHeight(node.getHeight() - 1) + node.setLeft(Node(aux)) + node.getLeft().setHeight(node.getHeight() + 1) + node.getRight().setHeight(node.getRight().getHeight() - 1) def rotate_right(self, node): - pass + aux = node.getLabel() + node = aux.getLeft() + node.setHeight(node.getHeight() - 1) + node.setRight(Node(aux)) + node.getLeft().setHeight(node.getHeight() + 1) + node.getLeft().setHeight(node.getLeft().getHeight() - 1) def double_rotate_left(self, node): pass From f65fe8c858636c0e7d29e7f9561d3109f984978b Mon Sep 17 00:00:00 2001 From: Rafael Date: Thu, 6 Jul 2017 21:13:56 +0200 Subject: [PATCH 4/4] more rotations --- data_structures/AVL/AVL.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/data_structures/AVL/AVL.py b/data_structures/AVL/AVL.py index ab09743e..0e3008dc 100644 --- a/data_structures/AVL/AVL.py +++ b/data_structures/AVL/AVL.py @@ -123,7 +123,9 @@ class AVL: node.getLeft().setHeight(node.getLeft().getHeight() - 1) def double_rotate_left(self, node): - pass + self.rotate_right(node.getRight().getRight()) + self.rotate_left(node) - def double_rotate_righs(self, node): - pass + def double_rotate_right(self, node): + self.rotate_left(node.getLeft().getLeft()) + self.rotate_right(node)