Advertisement
xiaoxiang1225

Untitled

Nov 17th, 2019
603
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.36 KB | None | 0 0
  1. class TreeNode:
  2.     def __init__(self, key, val, left = None, right = None, parent = None):
  3.         self.key = key
  4.         self.payload = val
  5.         self.leftChild = left
  6.         self.rightChild = right
  7.         self.parent = parent
  8.         self.successor = None
  9.  
  10.     def hasLeftChild(self):
  11.         return self.leftChild
  12.  
  13.     def hasRightChild(self):
  14.         return self.rightChild
  15.  
  16.     def isLeftChild(self):
  17.         return self.parent and self.parent.leftChild == self
  18.  
  19.     def isRightChild(self):
  20.         return self.parent and self.parent.rightChild == self
  21.  
  22.     def isRoot(self):
  23.         return not self.parent
  24.  
  25.     def isLeaf(self):
  26.         return not (self.rightChild or self.leftChild)
  27.  
  28.     def hasAnyChildren(self):
  29.         return self.rightChild or self.leftChild
  30.  
  31.     def hasBothChildren(self):
  32.         return self.rightChild and self.leftChild
  33.  
  34.     def spliceOut(self):
  35.         if self.isLeaf():
  36.             if self.isLeftChild():
  37.                 self.parent.leftChild = None
  38.             else:
  39.                 self.parent.rightChild = None
  40.         elif self.hasAnyChildren():
  41.             if self.hasLeftChild():
  42.                 if self.isLeftChild():
  43.                     self.parent.leftChild = self.leftChild
  44.                 else:
  45.                     self.parent.rightChild = self.leftChild
  46.                 self.leftChild.parent = self.parent
  47.             else:
  48.                 if self.isLeftChild():
  49.                     self.parent.leftChild = self.rightChild
  50.                 else:
  51.                     self.parent.rightChild = self.rightChild
  52.                 self.rightChild.parent = self.parent
  53.  
  54.     def findSuccessor(self):
  55.         succ = None
  56.         if self.hasRightChild():
  57.             succ = self.rightChild.findMin()
  58.         else:
  59.             if self.parent:
  60.                 if self.isLeftChild():
  61.                     succ = self.parent
  62.                 else:
  63.                     self.parent.rightChild = None
  64.                     succ = self.parent.findSuccessor()
  65.                     self.parent.rightChild = self
  66.         return succ
  67.  
  68.     def findPredeccessor(self):
  69.         pred = None
  70.  
  71.         if self.hasLeftChild():
  72.             pred = self.leftChild.findMax()
  73.         else:
  74.             if self.parent:
  75.                 if self.isRightChild():
  76.                     pred = self.parent
  77.                 else:
  78.                     self.parent.leftChild = None
  79.                     pred = self.parent.findPredeccessor()
  80.                     self.parent.leftChild = self
  81.         return pred
  82.  
  83.  
  84.     def findMin(self):
  85.         current = self
  86.         while current.hasLeftChild():
  87.             current = current.leftChild
  88.         return current
  89.  
  90.     def findMax(self):
  91.         current = self
  92.         while current.hasRightChild():
  93.             current = current.rightChild
  94.         return current
  95.  
  96.     def replaceNodeData(self, key, value, lc, rc):
  97.         self.key = key
  98.         self.payload = value
  99.         self.leftChild = lc
  100.         self.rightChild = rc
  101.         if self.hasLeftChild():
  102.             self.leftChild.parent = self
  103.         if self.hasRightChild():
  104.             self.rightChild.parent = self
  105.  
  106.  
  107. class BinarySearchTree:
  108.  
  109.     def __init__(self):
  110.         self.root = None
  111.         self.size = 0
  112.  
  113.     def length(self):
  114.         return self.size
  115.  
  116.     def __len__(self):
  117.         return self.size
  118.  
  119.     def put(self, key, val):
  120.         if self.root:
  121.             self._put(key, val, self.root)
  122.         else:
  123.             self.root = TreeNode(key, val)
  124.         self.size = self.size + 1
  125.  
  126.     def _put(self, key, val, currentNode):
  127.         if key < currentNode.key:
  128.             if currentNode.hasLeftChild():
  129.                 self._put(key, val, currentNode.leftChild)
  130.             else:
  131.                 currentNode.leftChild = TreeNode(key, val, parent=currentNode)
  132.                 currentNode.leftChild.successor = currentNode.leftChild.findSuccessor()
  133.                 predeccessor = currentNode.leftChild.findPredeccessor()
  134.                 if predeccessor is not None:
  135.                     predeccessor.successor = currentNode.leftChild
  136.  
  137.         else:
  138.             if currentNode.hasRightChild():
  139.                 self._put(key, val, currentNode.rightChild)
  140.             else:
  141.                 currentNode.rightChild = TreeNode(key, val, parent=currentNode)
  142.                 currentNode.rightChild.successor = currentNode.rightChild.findSuccessor()
  143.                 predeccessor = currentNode.rightChild.findPredeccessor()
  144.                 if predeccessor is not None:
  145.                     predeccessor.successor = currentNode.rightChild
  146.  
  147.  
  148.     def __setitem__(self, k, v):
  149.         self.put(k, v)
  150.  
  151.     def get(self, key):
  152.         if self.root:
  153.             res = self._get(key, self.root)
  154.             if res:
  155.                 return res.payload
  156.             else:
  157.                 return None
  158.         else:
  159.             return None
  160.  
  161.     def _get(self, key, currentNode):
  162.         if not currentNode:
  163.             return None
  164.         elif currentNode.key == key:
  165.             return currentNode
  166.         elif key < currentNode.key:
  167.             return self._get(key, currentNode.leftChild)
  168.         else:
  169.             return self._get(key, currentNode.rightChild)
  170.  
  171.     def __getitem__(self, key):
  172.         return self.get(key)
  173.  
  174.     def __contains__(self, key):
  175.         if self._get(key, self.root):
  176.             return True
  177.         else:
  178.             return False
  179.  
  180.     def delete(self, key):
  181.         if self.size > 1:
  182.             nodeToRemove = self._get(key, self.root)
  183.             if nodeToRemove:
  184.                 self.remove(nodeToRemove)
  185.                 self.size = self.size - 1
  186.             else:
  187.                 raise KeyError('Error, key not in tree')
  188.         elif self.size == 1 and self.root.key == key:
  189.             self.root = None
  190.             self.size = self.size - 1
  191.         else:
  192.             raise KeyError('Error, key not in tree')
  193.  
  194.     def __delitem__(self, key):
  195.         self.delete(key)
  196.  
  197.     def remove(self, currentNode):
  198.  
  199.         predeccessor = currentNode.findPredeccessor()
  200.         predeccessor.successor = currentNode.successor
  201.  
  202.         if currentNode.isLeaf():  # leaf
  203.             if currentNode == currentNode.parent.leftChild:
  204.                 currentNode.parent.leftChild = None
  205.             else:
  206.                 currentNode.parent.rightChild = None
  207.         elif currentNode.hasBothChildren():  # interior
  208.             succ = currentNode.findSuccessor()
  209.             succ.spliceOut()
  210.             currentNode.key = succ.key
  211.             currentNode.payload = succ.payload
  212.  
  213.         else:  # this node has one child
  214.             if currentNode.hasLeftChild():
  215.                 if currentNode.isLeftChild():
  216.                     currentNode.leftChild.parent = currentNode.parent
  217.                     currentNode.parent.leftChild = currentNode.leftChild
  218.                 elif currentNode.isRightChild():
  219.                     currentNode.leftChild.parent = currentNode.parent
  220.                     currentNode.parent.rightChild = currentNode.leftChild
  221.                 else:
  222.                     currentNode.replaceNodeData(currentNode.leftChild.key,
  223.                                                 currentNode.leftChild.payload,
  224.                                                 currentNode.leftChild.leftChild,
  225.                                                 currentNode.leftChild.rightChild)
  226.             else:
  227.                 if currentNode.isLeftChild():
  228.                     currentNode.rightChild.parent = currentNode.parent
  229.                     currentNode.parent.leftChild = currentNode.rightChild
  230.                 elif currentNode.isRightChild():
  231.                     currentNode.rightChild.parent = currentNode.parent
  232.                     currentNode.parent.rightChild = currentNode.rightChild
  233.                 else:
  234.                     currentNode.replaceNodeData(currentNode.rightChild.key,
  235.                                                 currentNode.rightChild.payload,
  236.                                                 currentNode.rightChild.leftChild,
  237.                                                 currentNode.rightChild.rightChild)
  238.  
  239.     def inorder_successors(self):
  240.         min = self.root.findMin()
  241.         max = self.root.findMax()
  242.         current = min
  243.         inorder = []
  244.  
  245.         while current.key is not max.key:
  246.             inorder.append(current.key)
  247.             current = current.findSuccessor()
  248.  
  249.         inorder.append(current.key)
  250.         return inorder
  251.  
  252.     def inorder_predeccessors(self):
  253.         min = self.root.findMin()
  254.         max = self.root.findMax()
  255.         current = max
  256.         inorder = []
  257.  
  258.         while current.key is not min.key:
  259.             inorder.append(current.key)
  260.             current = current.findPredeccessor()
  261.  
  262.         inorder.append(current.key)
  263.         return inorder
  264.  
  265.     def inorder_traversal(self):
  266.         currentnode = self.root.findMin()
  267.         outputlist = []
  268.  
  269.         while currentnode is not None:
  270.             outputlist.append(currentnode.key)
  271.             currentnode = currentnode.successor
  272.  
  273.         return outputlist
  274.  
  275.  
  276.  
  277. mytree = BinarySearchTree()
  278. mytree[3] = "red"
  279. mytree[4] = "blue"
  280. mytree[6] = "yellow"
  281. mytree[2] = "at"
  282.  
  283.  
  284.  
  285. mytree[7] = "purple"
  286.  
  287. print(mytree.inorder_traversal())
  288.  
  289. mytree.delete(4)
  290.  
  291. print(mytree.inorder_traversal())
  292.  
  293. mytree[4] = "pink"
  294.  
  295. print(mytree.inorder_traversal())
  296.  
  297. mytree[8] = "ta"
  298.  
  299. print(mytree.inorder_traversal())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement