From d8a0afc55065467bc642fca181c6560565cb0247 Mon Sep 17 00:00:00 2001 From: Rafael Date: Fri, 7 Jul 2017 19:08:04 +0200 Subject: [PATCH 1/6] fix error in preshow --- data_structures/Binary Tree/binary_seach_tree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/Binary Tree/binary_seach_tree.py b/data_structures/Binary Tree/binary_seach_tree.py index 1dac948ae..7840b2a32 100644 --- a/data_structures/Binary Tree/binary_seach_tree.py +++ b/data_structures/Binary Tree/binary_seach_tree.py @@ -68,7 +68,7 @@ class BinarySearchTree: return False def preShow(self, curr_node): - if curr_node is None: + if curr_node is not None: print(curr_node.getLabel(), end=" ") self.preShow(curr_node.getLeft()) From 8384cbb8792cade306b630b56917e9ee41b4ba55 Mon Sep 17 00:00:00 2001 From: Rafael Date: Fri, 7 Jul 2017 20:06:33 +0200 Subject: [PATCH 2/6] finish AVL --- data_structures/AVL/AVL.py | 82 ++++++++++++++++++++++++++------------ 1 file changed, 56 insertions(+), 26 deletions(-) diff --git a/data_structures/AVL/AVL.py b/data_structures/AVL/AVL.py index 0e3008dc1..ad8458365 100644 --- a/data_structures/AVL/AVL.py +++ b/data_structures/AVL/AVL.py @@ -39,7 +39,7 @@ class Node: def setHeight(self, height): self.height = height - def getHeight(self, height): + def getHeight(self): return self.height @@ -72,38 +72,36 @@ class AVL: 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): - if (node.getRight().getHeight() - - node.getLeft.getHeight() > 1): - if (node.getRight().getHeight() > - node.getLeft.getHeight()): - pass + height_right = 0 + height_left = 0 + + if node.getRight() is not None: + height_right = node.getRight().getHeight() + + if node.getLeft() is not None: + height_left = node.getLeft().getHeight() + + if abs(height_left - height_right) > 1: + if height_left > height_right: + right_child = node.getRight() + if (right_child.getLeft().getHeight() > + right_child.getRight().getHeight()): + self.rotate_left(node) + else: + self.double_rotate_right(node) else: - pass - pass - elif (node.getRight().getHeight() - - node.getLeft.getHeight() > 2): - if (node.getRight().getHeight() > - node.getLeft.getHeight()): - pass - else: - pass - pass - pass + left_child = node.getLeft() + if (left_child.getLeft().getHeight() > + left_child.getRight().getHeight()): + self.double_rotate_left(node) + else: + self.rotate_right(node) def rotate_left(self, node): # TODO: is this pythonic enought? @@ -129,3 +127,35 @@ class AVL: def double_rotate_right(self, node): self.rotate_left(node.getLeft().getLeft()) self.rotate_right(node) + + def empty(self): + if self.root is None: + return True + return False + + def preShow(self, curr_node): + if curr_node is not None: + self.preShow(curr_node.getLeft()) + print(curr_node.getLabel(), end=" ") + self.preShow(curr_node.getRight()) + + def getRoot(self): + return self.root + +t = AVL() +t.insert(11) +t.insert(14) +t.insert(3) +t.insert(4) +t.insert(5) +t.insert(6) +t.insert(7) +t.insert(8) +t.insert(9) +t.insert(10) +t.insert(1) +t.insert(12) +t.insert(13) +t.insert(2) +t.insert(15) +t.preShow(t.getRoot()) From 67f23f59b15581be38c5d630018e590148928384 Mon Sep 17 00:00:00 2001 From: Rafael Date: Sat, 8 Jul 2017 01:26:49 +0200 Subject: [PATCH 3/6] rotate left almost working --- data_structures/AVL/AVL.py | 177 +++++++++++++++++++++++++++---------- 1 file changed, 129 insertions(+), 48 deletions(-) diff --git a/data_structures/AVL/AVL.py b/data_structures/AVL/AVL.py index ad8458365..4a360fee5 100644 --- a/data_structures/AVL/AVL.py +++ b/data_structures/AVL/AVL.py @@ -23,18 +23,24 @@ class Node: def setLeft(self, left): self.left = left - + self.left.setParent(self) + self.left.setHeight(self.height + 1) + def getRight(self): return self.rigt def setRight(self, right): self.rigt = right + self.rigt.setParent(self) + self.rigt.setHeight(self.height + 1) def getParent(self): return self.parent def setParent(self, parent): self.parent = parent + self.height = (self.parent.getHeight() + 1 if + (self.parent is not None) else 0) def setHeight(self, height): self.height = height @@ -53,6 +59,7 @@ class AVL: node = Node(value) if self.root is None: self.root = node + self.root.setHeight(0) self.size = 1 else: # Same as Binary Tree @@ -71,54 +78,59 @@ class AVL: else: if node.getLabel() < dad_node.getLabel(): dad_node.setLeft(node) - dad_node.setHeight(dad_node.getHeight() + 1) else: dad_node.setRight(node) - dad_node.setHeight(dad_node.getHeight() + 1) + self.rebalance(dad_node) break def rebalance(self, node): height_right = 0 height_left = 0 + n = node + while n is not None: + height_right = 0 + height_left = 0 - if node.getRight() is not None: - height_right = node.getRight().getHeight() + if node.getRight() is not None: + height_right = node.getRight().getHeight() - if node.getLeft() is not None: - height_left = node.getLeft().getHeight() + if node.getLeft() is not None: + height_left = node.getLeft().getHeight() - if abs(height_left - height_right) > 1: - if height_left > height_right: - right_child = node.getRight() - if (right_child.getLeft().getHeight() > - right_child.getRight().getHeight()): - self.rotate_left(node) + if abs(height_left - height_right) > 1: + if height_left > height_right: + left_child = node.getRight() + if (): + self.rotate_left(n) + break + else: + self.double_rotate_right(n) + break else: - self.double_rotate_right(node) - else: - left_child = node.getLeft() - if (left_child.getLeft().getHeight() > - left_child.getRight().getHeight()): - self.double_rotate_left(node) - else: - self.rotate_right(node) + right_child = node.getRight() + if right_child is not None: + h_right = (right_child.getRight().getHeight() + if (right_child.getRight() is not None) else 0) + h_left = (right_child.getLeft().getHeight() + if (right_child.getLeft() is not None) else 0) + + if (h_left > h_right): + self.double_rotate_left(n) + break + else: + self.rotate_right(n) + print(n.getLabel()) + break + n = n.getParent() def rotate_left(self, node): - # 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) + pass def rotate_right(self, node): - 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) + n = Node(node.getLabel()) + n.setRight(node.getRight()) + n.setLeft(Node(node.getParent().getLabel())) + node = n def double_rotate_left(self, node): self.rotate_right(node.getRight().getRight()) @@ -139,23 +151,92 @@ class AVL: print(curr_node.getLabel(), end=" ") self.preShow(curr_node.getRight()) + def preorden(self, curr_node): + if curr_node is not None: + self.preShow(curr_node.getLeft()) + self.preShow(curr_node.getRight()) + print(curr_node.getLabel(), end=" ") + def getRoot(self): return self.root t = AVL() -t.insert(11) -t.insert(14) -t.insert(3) -t.insert(4) -t.insert(5) -t.insert(6) -t.insert(7) -t.insert(8) -t.insert(9) -t.insert(10) +# t.insert(1) +# t.preShow(t.getRoot()) +# print("\n") +# t.preorden(t.getRoot()) +# print("\n") +# t.insert(2) +# t.preShow(t.getRoot()) +# print("\n") +# t.preorden(t.getRoot()) +# print("\n") +# t.insert(3) +# t.preShow(t.getRoot()) +# print("\n") +# t.preorden(t.getRoot()) +# print("\n") +# print(t.getRoot().getHeight()) +# print(t.getRoot().getRight().getHeight()) t.insert(1) -t.insert(12) -t.insert(13) t.insert(2) -t.insert(15) -t.preShow(t.getRoot()) +t.insert(3) +# t.insert(4) +# t.preShow(t.getRoot()) +# print("\n") +# t.preorden(t.getRoot()) +# print("\n") +# t.insert(5) +# t.preShow(t.getRoot()) +# print("\n") +# t.preorden(t.getRoot()) +# print("\n") +# t.insert(6) +# t.preShow(t.getRoot()) +# print("\n") +# t.preorden(t.getRoot()) +# print("\n") +# t.insert(7) +# t.preShow(t.getRoot()) +# print("\n") +# t.preorden(t.getRoot()) +# print("\n") +# t.insert(8) +# t.preShow(t.getRoot()) +# print("\n") +# t.preorden(t.getRoot()) +# print("\n") +# t.insert(9) +# t.preShow(t.getRoot()) +# print("\n") +# t.preorden(t.getRoot()) +# print("\n") +# t.insert(10) +# t.preShow(t.getRoot()) +# print("\n") +# t.preorden(t.getRoot()) +# print("\n") +# t.insert(11) +# t.preShow(t.getRoot()) +# print("\n") +# t.preorden(t.getRoot()) +# print("\n") +# t.insert(12) +# t.preShow(t.getRoot()) +# print("\n") +# t.preorden(t.getRoot()) +# print("\n") +# t.insert(13) +# t.preShow(t.getRoot()) +# print("\n") +# t.preorden(t.getRoot()) +# print("\n") +# t.insert(14) +# t.preShow(t.getRoot()) +# print("\n") +# t.preorden(t.getRoot()) +# print("\n") +# t.insert(15) +# t.preShow(t.getRoot()) +# print("\n") +# t.preorden(t.getRoot()) From d8cd33add2274af8f8ef6371f2bb019bab734b98 Mon Sep 17 00:00:00 2001 From: Rafael Date: Sat, 8 Jul 2017 20:50:47 +0200 Subject: [PATCH 4/6] using python properties --- data_structures/AVL/AVL.py | 67 +++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 38 deletions(-) diff --git a/data_structures/AVL/AVL.py b/data_structures/AVL/AVL.py index 4a360fee5..f1ac16ef8 100644 --- a/data_structures/AVL/AVL.py +++ b/data_structures/AVL/AVL.py @@ -12,41 +12,32 @@ class Node: self.parent = None self.height = 0 - def getLabel(self): - return self.label + @property + def right(self): + return self.right - def setLabel(self, label): - self.label = label + @right.setter + def right(self, node): + node.parent = self + self.right = node - def getLeft(self): - return self.left - - def setLeft(self, left): - self.left = left - self.left.setParent(self) - self.left.setHeight(self.height + 1) - - def getRight(self): - return self.rigt - - def setRight(self, right): - self.rigt = right - self.rigt.setParent(self) - self.rigt.setHeight(self.height + 1) - - def getParent(self): + @property + def left(self): return self.parent - def setParent(self, parent): - self.parent = parent - self.height = (self.parent.getHeight() + 1 if - (self.parent is not None) else 0) + @left.setter + def left(self, node): + node.parent = self + self.left = node - def setHeight(self, height): - self.height = height + @property + def parent(self): + return self.parent - def getHeight(self): - return self.height + @parent.setter + def parent(self, node): + self.parent = node + self.height = self.parent.height + 1 class AVL: @@ -59,7 +50,7 @@ class AVL: node = Node(value) if self.root is None: self.root = node - self.root.setHeight(0) + self.root.height = 0 self.size = 1 else: # Same as Binary Tree @@ -71,16 +62,18 @@ class AVL: dad_node = curr_node - if node.getLabel() < curr_node.getLabel(): - curr_node = curr_node.getLeft() + if node.label < curr_node.label: + curr_node = curr_node.left else: - curr_node = curr_node.getRight() + curr_node = curr_node.rigt else: - if node.getLabel() < dad_node.getLabel(): - dad_node.setLeft(node) + if node.label < dad_node.label: + dad_node.left = node else: - dad_node.setRight(node) + dad_node.right = node + self.rebalance(dad_node) + self.size += 1 break def rebalance(self, node): @@ -119,7 +112,6 @@ class AVL: break else: self.rotate_right(n) - print(n.getLabel()) break n = n.getParent() @@ -130,7 +122,6 @@ class AVL: n = Node(node.getLabel()) n.setRight(node.getRight()) n.setLeft(Node(node.getParent().getLabel())) - node = n def double_rotate_left(self, node): self.rotate_right(node.getRight().getRight()) From 8e41aca1b943d9bbbd742f57a0aa58cfa5e6c35e Mon Sep 17 00:00:00 2001 From: Rafael Date: Mon, 10 Jul 2017 18:29:45 +0200 Subject: [PATCH 5/6] node now eses pythonproperties --- data_structures/AVL/AVL.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/data_structures/AVL/AVL.py b/data_structures/AVL/AVL.py index f1ac16ef8..0c34cb597 100644 --- a/data_structures/AVL/AVL.py +++ b/data_structures/AVL/AVL.py @@ -7,9 +7,6 @@ class Node: def __init__(self, label): self.label = label - self.left = None - self.rigt = None - self.parent = None self.height = 0 @property @@ -23,7 +20,7 @@ class Node: @property def left(self): - return self.parent + return self.left @left.setter def left(self, node): @@ -48,6 +45,7 @@ class AVL: def insert(self, value): node = Node(value) + if self.root is None: self.root = node self.root.height = 0 @@ -65,7 +63,7 @@ class AVL: if node.label < curr_node.label: curr_node = curr_node.left else: - curr_node = curr_node.rigt + curr_node = curr_node.right else: if node.label < dad_node.label: dad_node.left = node @@ -92,7 +90,7 @@ class AVL: if abs(height_left - height_right) > 1: if height_left > height_right: - left_child = node.getRight() + # left_child = node.getRight() if (): self.rotate_left(n) break @@ -100,12 +98,12 @@ class AVL: self.double_rotate_right(n) break else: - right_child = node.getRight() + right_child = node.right if right_child is not None: - h_right = (right_child.getRight().getHeight() - if (right_child.getRight() is not None) else 0) - h_left = (right_child.getLeft().getHeight() - if (right_child.getLeft() is not None) else 0) + h_right = (right_child.right.height + if (right_child.right is not None) else 0) + h_left = (right_child.left.height + if (right_child.left is not None) else 0) if (h_left > h_right): self.double_rotate_left(n) @@ -119,9 +117,13 @@ class AVL: pass def rotate_right(self, node): - n = Node(node.getLabel()) - n.setRight(node.getRight()) - n.setLeft(Node(node.getParent().getLabel())) + aux = node.parent + node.parent = node + node.left = aux + + print(node.parent.label) + print(node.parent.right.label) + print(node.parent.left.label) def double_rotate_left(self, node): self.rotate_right(node.getRight().getRight()) From 6903d95b41206d757540f48230e245e7f28b8667 Mon Sep 17 00:00:00 2001 From: Rafael Leyva Ruiz Date: Mon, 2 Oct 2017 16:32:59 +0200 Subject: [PATCH 6/6] AVL done --- data_structures/AVL/AVL.py | 173 +++++++++++++------------------------ 1 file changed, 59 insertions(+), 114 deletions(-) diff --git a/data_structures/AVL/AVL.py b/data_structures/AVL/AVL.py index 0c34cb597..9717f1b6e 100644 --- a/data_structures/AVL/AVL.py +++ b/data_structures/AVL/AVL.py @@ -7,34 +7,42 @@ class Node: def __init__(self, label): self.label = label + self._parent = None + self._left = None + self._right = None self.height = 0 @property def right(self): - return self.right + return self._right @right.setter def right(self, node): - node.parent = self - self.right = node + if node is not None: + node._parent = self + self._right = node @property def left(self): - return self.left + return self._left @left.setter def left(self, node): - node.parent = self - self.left = node + if node is not None: + node._parent = self + self._left = node @property def parent(self): - return self.parent + return self._parent @parent.setter def parent(self, node): - self.parent = node - self.height = self.parent.height + 1 + if node is not None: + self._parent = node + self.height = self.parent.height + 1 + else: + self.height = 0 class AVL: @@ -45,7 +53,7 @@ class AVL: def insert(self, value): node = Node(value) - + if self.root is None: self.root = node self.root.height = 0 @@ -65,65 +73,72 @@ class AVL: else: curr_node = curr_node.right else: + node.height = dad_node.height + dad_node.height += 1 if node.label < dad_node.label: dad_node.left = node else: dad_node.right = node - - self.rebalance(dad_node) + self.rebalance(node) self.size += 1 break def rebalance(self, node): - height_right = 0 - height_left = 0 n = node + while n is not None: - height_right = 0 - height_left = 0 + height_right = n.height + height_left = n.height - if node.getRight() is not None: - height_right = node.getRight().getHeight() + if n.right is not None: + height_right = n.right.height - if node.getLeft() is not None: - height_left = node.getLeft().getHeight() + if n.left is not None: + height_left = n.left.height if abs(height_left - height_right) > 1: if height_left > height_right: - # left_child = node.getRight() - if (): + left_child = n.left + if left_child is not None: + h_right = (right_child.right.height + if (right_child.right is not None) else 0) + h_left = (right_child.left.height + if (right_child.left is not None) else 0) + if (h_left > h_right): self.rotate_left(n) break else: self.double_rotate_right(n) break else: - right_child = node.right + right_child = n.right if right_child is not None: h_right = (right_child.right.height if (right_child.right is not None) else 0) h_left = (right_child.left.height if (right_child.left is not None) else 0) - if (h_left > h_right): self.double_rotate_left(n) break else: self.rotate_right(n) break - n = n.getParent() + n = n.parent def rotate_left(self, node): - pass + aux = node.parent.label + node.parent.label = node.label + node.parent.right = Node(aux) + node.parent.right.height = node.parent.height + 1 + node.parent.left = node.right + def rotate_right(self, node): - aux = node.parent - node.parent = node - node.left = aux - - print(node.parent.label) - print(node.parent.right.label) - print(node.parent.left.label) + aux = node.parent.label + node.parent.label = node.label + node.parent.left = Node(aux) + node.parent.left.height = node.parent.height + 1 + node.parent.right = node.right def double_rotate_left(self, node): self.rotate_right(node.getRight().getRight()) @@ -140,96 +155,26 @@ class AVL: def preShow(self, curr_node): if curr_node is not None: - self.preShow(curr_node.getLeft()) - print(curr_node.getLabel(), end=" ") - self.preShow(curr_node.getRight()) + self.preShow(curr_node.left) + print(curr_node.label, end=" ") + self.preShow(curr_node.right) - def preorden(self, curr_node): + def preorder(self, curr_node): if curr_node is not None: - self.preShow(curr_node.getLeft()) - self.preShow(curr_node.getRight()) - print(curr_node.getLabel(), end=" ") + self.preShow(curr_node.left) + self.preShow(curr_node.right) + print(curr_node.label, end=" ") def getRoot(self): return self.root t = AVL() -# t.insert(1) -# t.preShow(t.getRoot()) -# print("\n") -# t.preorden(t.getRoot()) -# print("\n") -# t.insert(2) -# t.preShow(t.getRoot()) -# print("\n") -# t.preorden(t.getRoot()) -# print("\n") -# t.insert(3) -# t.preShow(t.getRoot()) -# print("\n") -# t.preorden(t.getRoot()) -# print("\n") -# print(t.getRoot().getHeight()) -# print(t.getRoot().getRight().getHeight()) t.insert(1) t.insert(2) t.insert(3) +# t.preShow(t.root) +# print("\n") # t.insert(4) -# t.preShow(t.getRoot()) -# print("\n") -# t.preorden(t.getRoot()) -# print("\n") # t.insert(5) -# t.preShow(t.getRoot()) -# print("\n") -# t.preorden(t.getRoot()) -# print("\n") -# t.insert(6) -# t.preShow(t.getRoot()) -# print("\n") -# t.preorden(t.getRoot()) -# print("\n") -# t.insert(7) -# t.preShow(t.getRoot()) -# print("\n") -# t.preorden(t.getRoot()) -# print("\n") -# t.insert(8) -# t.preShow(t.getRoot()) -# print("\n") -# t.preorden(t.getRoot()) -# print("\n") -# t.insert(9) -# t.preShow(t.getRoot()) -# print("\n") -# t.preorden(t.getRoot()) -# print("\n") -# t.insert(10) -# t.preShow(t.getRoot()) -# print("\n") -# t.preorden(t.getRoot()) -# print("\n") -# t.insert(11) -# t.preShow(t.getRoot()) -# print("\n") -# t.preorden(t.getRoot()) -# print("\n") -# t.insert(12) -# t.preShow(t.getRoot()) -# print("\n") -# t.preorden(t.getRoot()) -# print("\n") -# t.insert(13) -# t.preShow(t.getRoot()) -# print("\n") -# t.preorden(t.getRoot()) -# print("\n") -# t.insert(14) -# t.preShow(t.getRoot()) -# print("\n") -# t.preorden(t.getRoot()) -# print("\n") -# t.insert(15) -# t.preShow(t.getRoot()) -# print("\n") -# t.preorden(t.getRoot()) +# t.preShow(t.root) +# t.preorden(t.root)