Skip to content

Instantly share code, notes, and snippets.

@Rui-qi-Li
Created February 7, 2019 23:54
Show Gist options
  • Select an option

  • Save Rui-qi-Li/2a6af7f7450049d31b2893d8e16d58a5 to your computer and use it in GitHub Desktop.

Select an option

Save Rui-qi-Li/2a6af7f7450049d31b2893d8e16d58a5 to your computer and use it in GitHub Desktop.

Revisions

  1. Rui-qi-Li created this gist Feb 7, 2019.
    108 changes: 108 additions & 0 deletions BST.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,108 @@
    class Node:
    def __init__(self,data):
    self.data = data
    self.left = None
    self.right = None
    def getChildren(self):
    children=[]
    if self.left:
    children.append(self.left)
    if self.right:
    children.append(self.right)
    return children


    class BST:
    def __init__(self,data):
    self.root = Node(data)
    def insert(self,data):
    if not self.root:
    self.root =Node(data)
    else:
    self.insertNode(self.root,data)
    def insertNode(self,curr,data):
    if data<=curr.data:
    if curr.left:
    self.insertNode(curr.left,data)
    else:
    curr.left = Node(data)
    else:
    if curr.right:
    self.insertNode(curr.right,data)
    else:
    curr.right = Node(data)
    def find(self,data):
    return self.findNode(self.root,data)
    def findNode(self,curr,data):
    if not curr:
    return False
    elif data == curr.data:
    return True
    elif data < curr.data:
    return self.findNode(curr.left,data)
    elif data > curr.data:
    return self.findNode(curr.right,data)
    def inorder(self):
    if not self.root:
    return 'Empty tree'
    else:
    self.inorderNode(self.root)

    def inorderNode(self,curr):
    if curr.left: # print left
    self.inorderNode(curr.left)
    print(curr.data) # print root
    if curr.right:
    self.inorderNode(curr.right) # print right
    def preorder(self):
    if not self.root:
    return 'Empty tree'
    else:
    self.preorderNode(self.root)
    def preorderNode(self,curr):
    print(curr.data) # print root
    if curr.left: # print left
    self.preorderNode(curr.left)
    if curr.right: # print left
    self.preorderNode(curr.right)
    def minvalue(self):
    if not self.root:
    return 'Empty tree'
    else:
    minNode = self.minvalueNode(self.root)
    print(minNode.data)
    def minvalueNode(self,curr):
    while curr.left:
    curr = curr.left
    return curr
    def delete(self,data):
    if not self.root:
    return 'Empty tree, del reject'
    else:
    self.deleteNode(self.root,data)
    def deleteNode(self,curr,data):
    # base case
    if not curr:
    return curr # None
    if data < curr.data:
    curr.left = self.deleteNode(curr.left,data)
    elif data > curr.data:
    curr.right = self.deleteNode(curr.right,data)
    else: # found node need to be deleted
    # 0/1 right child
    if not curr.left:
    temp = curr.right
    curr = None
    return temp
    elif not curr.left:
    temp = curr.left
    curr = None
    return temp
    # 2 children
    # get the inorder successor (smallest in the right subtree)
    temp = self.minvalueNode(curr.right)
    # copy the inorder successor's content to this Node
    curr.data = temp.data
    # delete the inorder successor, single leaf
    self.deleteNode(curr.right, temp.data)
    return curr # return curr/curr.left/curr.right