Exemplo n.º 1
0
def buildTree(preorder, inorder):
    if inorder:
        ind = inorder.index(preorder.pop(0))
        root = Node(inorder[ind])
        root._left = buildTree(preorder, inorder[0:ind])
        root._right = buildTree(preorder, inorder[ind + 1:])
        return root
Exemplo n.º 2
0
def build_tree_from_array(A, start, end):
    if start > end:
        return
    mid = (start + end) / 2
    root = Node(A[mid])
    root.left = build_tree_from_array(A, start, mid - 1)
    root.right = build_tree_from_array(A, mid + 1, end)
    return root
Exemplo n.º 3
0
def getCountNodesInLevel(node: Node, level):
    if not Node:
        return 0
    if level == 0:
        return 1
    return getCountNodesInLevel(node.getLeftNode(),
                                level - 1) + getCountNodesInLevel(
                                    node.getRightNode(), level - 1)
Exemplo n.º 4
0
def merge_bst(bst1, bst2):
    merge = []
    s1 = bst1.inorder().copy()
    s2 = bst2.inorder().copy()
    while s1 and s2:
        if s1[0] <= s2[0]:
            merge.append(s1.pop(0))
        else:
            merge.append(s2.pop(0))
    new_root = Node(merge.pop(0))
    while merge:
        new_root.insert(merge.pop(0))
    return new_root
    def remove(self, node: Node):
        if not node.leftChild and not node.rightChild:
            if node.isleftchild():
                node.parent.leftChild = None
            else:
                node.parent.rightChild = None
            self.rebalance(node.parent)

        elif node.leftChild and not node.rightChild:
            if node.parent is None:
                node.leftChild.parent = None
                self.root = node.leftChild
            elif node.isleftchild():
                node.leftChild.parent = node.parent
                node.parent.leftChild = node.leftChild
            else:
                node.leftChild.parent = node.parent
                node.parent.rightChild = node.leftChild
            self.rebalance(node.parent)

        elif node.rightChild and not node.leftChild:
            if node.parent is None:
                node.rightChild.parent = None
                self.root = node.rightChild
            elif node.isleftchild():
                node.rightChild.parent = node.parent
                node.parent.leftChild = node.rightChild
            else:
                node.rightChild.parent = node.parent
                node.parent.rightChild = node.rightChild
            self.rebalance(node.parent)

        else:
            successor = self.find_successor(node)
            node.key = successor.key
            node.payload = successor.payload
            self.remove(successor)
Exemplo n.º 6
0
    def addIterative(self, value):
        newNode = Node(value)
        if (self._root is None):
            self._root = newNode
            return

        current = self._root
        parent = None
        while True:
            parent = current
            if (value == current._item):
                return
            if (value < current._item):
                current = current._left
                if (current is None):
                    parent._left = newNode
                    return
            else:
                current = current._right
                if (current is None):
                    parent._right = newNode
                    return
Exemplo n.º 7
0
 def insert(self, key):
     '''
     :param key:
     insert node with value key at first available position in level order traversal
     :return:None
     '''
     node = Node(key)
     if self.root is None:
         self.root = node
         return
     queue = [self.get_root()]
     while queue:
         this_node = queue.pop(0)
         if this_node.left is not None:
             queue.append(this_node.left)
         else:
             this_node.left = node
             break
         if this_node.right is not None:
             queue.append(this_node.right)
         else:
             this_node.right = node
             break
Exemplo n.º 8
0
def pair_sum_in_array(array, x):
    """Check whether there is a pair of numbers in sorted array with sum = x."""
    l = 0
    r = len(array) - 1
    while l < r:
        if array[l] + array[r] == x:
            return True
        elif array[l] + array[r] < x:
            l += 1
        else:
            r -= 1
    return False


def sum_in_bst(tree, x):
    """Find whether there is a pair of numbers in Binary Search Tree with sum = x."""
    return pair_sum_in_array(tree.inorder(), x)


if __name__ == "__main__":
    root1 = Node(50)
    root1.insert(30)
    root1.insert(20)
    root1.insert(40)
    root1.insert(70)
    root1.insert(60)
    root1.insert(80)
    print(sum_in_bst(root1, 50))
    print(sum_in_bst(root1, 150))
    print(sum_in_bst(root1, 250))
Exemplo n.º 9
0
        pass

    find_in_range(range_begin, range_end, node.right)


# Main
if __name__ == "__main__":
    tree = BinarySearchTree()
    keys_in_range = []

    # Insert some random-looking integers into the tree.
    user_values = input('Enter values to be inserted separated by spaces: ')
    print()

    for value in user_values.split():
        new_node = Node(value)
        tree.insert(new_node)

    # print('Initial tree:')
    # print(tree)
    # print()

    # Read in range values and starting node's key
    range_begin = input()
    range_end = input()
    s_node = input()

    # Find starting node in tree
    start_node = BinarySearchTree.search(tree, s_node)

    # Find keys in range from starting node
Exemplo n.º 10
0
    merge = []
    s1 = bst1.inorder().copy()
    s2 = bst2.inorder().copy()
    while s1 and s2:
        if s1[0] <= s2[0]:
            merge.append(s1.pop(0))
        else:
            merge.append(s2.pop(0))
    new_root = Node(merge.pop(0))
    while merge:
        new_root.insert(merge.pop(0))
    return new_root


if __name__ == "__main__":
    root1 = Node(50)
    root1.insert(30)
    root1.insert(20)
    root1.insert(40)
    root1.insert(70)
    root1.insert(60)
    root1.insert(80)
    root2 = Node(150)
    root2.insert(130)
    root2.insert(12)
    root2.insert(30)
    root2.insert(10)
    root2.insert(10)
    root2.insert(10)
    print(merge_bst(root1, root2).inorder())
Exemplo n.º 11
0
# coding=utf-8
"""Fix Binary Search Tree with two swapped nodes."""

from BinarySearchTree import Node


def fix_tree(tree):
    traversal = tree.inorder_object_traversal()
    vals = [x.key for x in traversal]
    vals.sort()
    for x in range(len(vals)):
        traversal[x].key = vals[x]


if __name__ == "__main__":
    root1 = Node(50)
    root1.insert(30)
    root1.insert(20)
    root1.insert(40)
    root1.insert(70)
    root1.insert(60)
    root1.insert(80)
    tr = root1.inorder_object_traversal()

    tr[2].key, tr[5].key = tr[5].key, tr[2].key
    print(root1.inorder())
    fix_tree(root1)
    print(root1.inorder())