Exemplo n.º 1
0
def testDist():
    myTree = LinkedBinaryTree()
    testNodes = []
    for x in range(4):
        testNodes.append(LinkedBinaryTree.Node(0))
    node4 = LinkedBinaryTree.Node(0, testNodes[0], testNodes[1])
    node2 = LinkedBinaryTree.Node(0, node4)
    node3 = LinkedBinaryTree.Node(0, testNodes[2], testNodes[3])
    root = LinkedBinaryTree.Node(0, node2, node3)
    myTree.root = root
    print(myTree.subtree_children_dist(myTree.root))
Exemplo n.º 2
0
    def testBuildTree(self):
        data = [1, 2, 3, 4, 5, 6]
        tree = LinkedBinaryTree(data)
        
        # Traverse the tree and verify it is properly built
        self.assertEquals(tree.root.key, 1)
        self.assertEquals(tree.root.parent, None)
        
        leftChild = tree.root.leftChild
        self.assertEquals(leftChild.key, 2)
        self.assertEquals(leftChild.parent, tree.root)
        
        leftLeftGrandChild = leftChild.leftChild
        self.assertEquals(leftLeftGrandChild.key, 4)
        self.assertEquals(leftLeftGrandChild.parent, leftChild)
        self.assertEquals(leftLeftGrandChild.leftChild, None)
        self.assertEquals(leftLeftGrandChild.rightChild, None)

        leftRightGrandChild = leftChild.rightChild
        self.assertEquals(leftRightGrandChild.key, 5)
        self.assertEquals(leftRightGrandChild.parent, leftChild)
        self.assertEquals(leftRightGrandChild.leftChild, None)
        self.assertEquals(leftRightGrandChild.rightChild, None)

        rightChild = tree.root.rightChild
        self.assertEquals(rightChild.key, 3)
        self.assertEquals(rightChild.parent, tree.root)
        self.assertEquals(rightChild.rightChild, None)

        rightLeftGrandChild = rightChild.leftChild
        self.assertEquals(rightLeftGrandChild.key, 6)
        self.assertEquals(rightLeftGrandChild.parent, rightChild)
        self.assertEquals(rightLeftGrandChild.leftChild, None)
        self.assertEquals(rightLeftGrandChild.rightChild, None)
Exemplo n.º 3
0
def main():
    node31 = LinkedBinaryTree.LinkedBinaryTree.Node(5)
    node32 = LinkedBinaryTree.LinkedBinaryTree.Node(1)
    node21 = LinkedBinaryTree.LinkedBinaryTree.Node(9, node31, node32)
    node22 = LinkedBinaryTree.LinkedBinaryTree.Node(8)
    node23 = LinkedBinaryTree.LinkedBinaryTree.Node(4)
    node11 = LinkedBinaryTree.LinkedBinaryTree.Node(2, node21)
    node12 = LinkedBinaryTree.LinkedBinaryTree.Node(7, node22, node23)
    node01 = LinkedBinaryTree.LinkedBinaryTree.Node(3, node11, node12)
    my_bin_tree = LinkedBinaryTree.LinkedBinaryTree(node01)
    print(min_and_max(my_bin_tree))
Exemplo n.º 4
0
def main():
    node31 = LinkedBinaryTree.LinkedBinaryTree.Node(5)
    node32 = LinkedBinaryTree.LinkedBinaryTree.Node(1)
    node21 = LinkedBinaryTree.LinkedBinaryTree.Node(9, node31, node32)
    node22 = LinkedBinaryTree.LinkedBinaryTree.Node(8)
    node23 = LinkedBinaryTree.LinkedBinaryTree.Node(4)
    node11 = LinkedBinaryTree.LinkedBinaryTree.Node(2, node21)
    node12 = LinkedBinaryTree.LinkedBinaryTree.Node(7, node22, node23)
    node01 = LinkedBinaryTree.LinkedBinaryTree.Node(3, node11, node12)
    my_bin_tree = LinkedBinaryTree.LinkedBinaryTree(node01)
    print(is_height_balanced(my_bin_tree))
Exemplo n.º 5
0
def invert_binary_tree(bin_tree):
    # in class method
    #way in review
    def invert_helper(subtree_root):
        if subtree_root is None:
            return None
        return LinkedBinaryTree.Node(subtree_root.data,
                                     invert_helper(subtree_root.right),
                                     invert_helper(subtree_root.left))

    return LinkedBinaryTree.LinkedBinaryTree(invert_helper(bin_tree.root))
Exemplo n.º 6
0
def create_expression_tree(prefix_exp_str):
    prefix_list = prefix_exp_str.split()
    operators = '+-*/'
    # start from the back and find the pos of the first operator
    start_pos = len(prefix_list) - 1
    for i in range(start_pos):
        if (prefix_list[start_pos] in operators):
            break
        else:
            start_pos -= 1
    helper_res = create_expression_tree_helper(prefix_list, 0)
    ret_tree = LinkedBinaryTree.LinkedBinaryTree(helper_res[0])
    return ret_tree
def create_exp_tree(prefix_exp_tree):
    prefix_exp_tree_lst = prefix_exp_tree.split(" ")
    print(prefix_exp_tree_lst)
    i = 0
    fin_tree = LinkedBinaryTree.LinkedBinaryTree()
    parent = 0
    curr = None
    operators = "+-*/"
    while i != (len(prefix_exp_tree_lst)):
        if i == 0:
            fin_tree.root = LinkedBinaryTree.LinkedBinaryTree.Node(
                prefix_exp_tree_lst[0])
            curr = fin_tree.root
            i += 1
        elif curr.left is None:
            if prefix_exp_tree_lst[i] not in operators:
                curr.left = LinkedBinaryTree.LinkedBinaryTree.Node(
                    int(prefix_exp_tree_lst[i]))
            else:
                curr.left = LinkedBinaryTree.LinkedBinaryTree.Node(
                    prefix_exp_tree_lst[i])
                curr.left.parent = curr
                curr = curr.left
            i += 1
        elif curr.right is None:
            if prefix_exp_tree_lst[i] not in operators:
                curr.right = LinkedBinaryTree.LinkedBinaryTree.Node(
                    int(prefix_exp_tree_lst[i]))
            else:
                curr.right = LinkedBinaryTree.LinkedBinaryTree.Node(
                    prefix_exp_tree_lst[i])
                curr.right.parent = curr
                curr = curr.right
            i += 1
        elif curr.right is not None and curr.left is not None:
            curr = curr.parent
            if curr == fin_tree.root:
                parent += 1
            if parent > 1:
                break
    return fin_tree
    #     if subtree_root is None:
    #         return (True, rootvalue,rootvalue)
    #     parent = subtree_root.parent.data
    #     left_bool, left_max, left_min = is_bst_helper(subtree_root.left)
    #     right_bool, right_max, right_min = is_bst_helper(subtree_root.right)
    #
    #     if left_min < parent < left_max and right_min < parent < right_max:
    #         if left_max < parent < right_min: #compare both trees
    #             return (True, right_max.data, left_min.data)
    #     # if right_min < parent < right_max:
    #     #     if left_max
    #     else:
    #         return (False, right_max.data, left_min.data)
    # return is_bst_helper(binary_tree.root)[0]

lbt = LinkedBinaryTree.LinkedBinaryTree()
left_child1 = lbt.Node(4)
right_left = lbt.Node(8)
right_child1 = lbt.Node(5, right_left)
root_node1 = lbt.Node(2, left_child1, right_child1)
print(is_bst(lbt))
tree1 = None
print(is_bst(tree1))
# tree1 = LinkedBinaryTree.LinkedBinaryTree(root_node1)
# print(is_bst(tree1))

#4

def lca_bst(bst, node1, node2): #O(h) where h is the height

    res = True
Exemplo n.º 9
0
import LinkedBinaryTree

l_ch1=LinkedBinaryTree.LinkedBinaryTree.Node(1)
r_ch1=LinkedBinaryTree.LinkedBinaryTree.Node(3)
l_ch2=LinkedBinaryTree.LinkedBinaryTree.Node(2,l_ch1,r_ch1)
l_ch3=LinkedBinaryTree.LinkedBinaryTree.Node(5)
r_ch2=LinkedBinaryTree.LinkedBinaryTree.Node(6,l_ch3)
root=LinkedBinaryTree.LinkedBinaryTree.Node(4,l_ch2,r_ch2)

tree = LinkedBinaryTree.LinkedBinaryTree(root)
x = tree.sum_of_a_tree()
height = tree.height()
print(x)
print(height)
Exemplo n.º 10
0
 def __init__(self):
     self.tree = LinkedBinaryTree()
     self.nextParent = None
Exemplo n.º 11
0
left_right_right = LinkedBinaryTree.LinkedBinaryTree.Node(4)
left_right_left = LinkedBinaryTree.LinkedBinaryTree.Node(7)
left_right = LinkedBinaryTree.LinkedBinaryTree.Node(9, left_right_left,
                                                    left_right_right)
left_child1 = LinkedBinaryTree.LinkedBinaryTree.Node(8, None, left_right)

right_right_right = LinkedBinaryTree.LinkedBinaryTree.Node(5)
right_right = LinkedBinaryTree.LinkedBinaryTree.Node(6, None,
                                                     right_right_right)
right_left = LinkedBinaryTree.LinkedBinaryTree.Node(1)
right_child1 = LinkedBinaryTree.LinkedBinaryTree.Node(2, right_left)

root_node1 = LinkedBinaryTree.LinkedBinaryTree.Node(3, left_child1,
                                                    right_child1)

bin_tree = LinkedBinaryTree.LinkedBinaryTree(root_node1)
#print(min_max(bin_tree))

#5
import LinkedBinaryTree
import ArrayStack


def iterative_inorders(bin_tree):
    #run linear time
    if bin_tree.is_empty():
        raise Exception("This tree is empty sir")
    stack = ArrayStack.ArrayStack()
    curr_node = bin_tree.root
    while True:
        if curr_node is not None:
Exemplo n.º 12
0
 def invert_helper(subtree_root):
     if subtree_root is None:
         return None
     return LinkedBinaryTree.Node(subtree_root.data,
                                  invert_helper(subtree_root.right),
                                  invert_helper(subtree_root.left))
Exemplo n.º 13
0
def recreate_tree(preorder, inorder):
    ans = LinkedBinaryTree()
    ans.root = recHelper(preorder, 0,
                         len(preorder) - 1, inorder, 0,
                         len(inorder) - 1)
    return ans