Hướng dẫn convert bst to array python - chuyển bst sang mảng python

Bạn có thể đại diện cho một cây nhị phân trong Python như một danh sách một chiều theo cùng một cách chính xác.

Show

Ví dụ: nếu bạn có ở cây được biểu thị là:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
0 là gốc
a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
1 &
a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
2 là cấp độ tiếp theo mà trẻ em của
a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
1 &
a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
2 là
a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
5 và
a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
6
a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
1 &
a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
2 are the next level
the children of
a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
1 &
a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
2 are
a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
5 and
a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
6

Điều này tương ứng với công thức của bạn. Đối với một nút nhất định tại Index

a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
7, trẻ em của nút đó là
a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
8
a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)
9. Đây là một cách phổ biến để mô hình hóa một đống. Bạn có thể đọc thêm về cách Python sử dụng điều này trong [Thư viện HEAPQ]. (Https://docs.python.org/3.0/l Library/heapq.html)

Bạn có thể sử dụng cái này để đi qua cây theo chiều sâu với một cái gì đó như:

a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)

Bản in này

         15
      6
         14
   2
         13
      5
         11
0
         10
      4
         9
   1
         8
      3
         7

Làm thế nào để bạn tạo ra một loạt các cây nhị phân?

Có thể xây dựng một mảng từ một cây nhị phân ?.

Đặt hàng trước: Thực hiện DFS bắt đầu từ gốc và lưu trữ các đỉnh theo thứ tự giống như bạn truy cập chúng. ....

In-Oder: Đơn đặt lại tất cả các đỉnh bên trái vào mảng, sau đó là chính của đỉnh, sau đó đệ quy các đỉnh của bên phải ..

Mảng có phải là BST không?:

Cho một mảng đại diện cho một cây theo cách mà các chỉ mục mảng là các giá trị trong các nút cây và giá trị mảng cung cấp cho nút cha của chỉ mục cụ thể đó (hoặc nút). Giá trị của chỉ mục nút gốc sẽ luôn là -1 vì không có cha mẹ cho root.

class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def array_to_bst(array_nums):
    if not array_nums:
        return None
    mid_num = len(array_nums)//2
    node = TreeNode(array_nums[mid_num])
    node.left = array_to_bst(array_nums[:mid_num])
    node.right = array_to_bst(array_nums[mid_num+1:])
    return node

def preOrder(node): 
    if not node: 
        return      
    print(node.val)
    preOrder(node.left) 
    preOrder(node.right)   

array_nums = [1,2,3,4,5,6,7]

print("Original array:")
print(array_nums)
result = array_to_bst(array_nums)
print("\nArray to a height balanced BST:")
print(preOrder(result))

Cập nhật lần cuối vào ngày 19 tháng 8 năm 2022 21:50:48 (UTC/GMT +8 giờ)

Original array:
[1, 2, 3, 4, 5, 6, 7]

Array to a height balanced BST:
4
2
1
3
6
5
7
None

Cây tìm kiếm nhị phân Python: Tập thể dục-5 với giải pháp

Hướng dẫn convert bst to array python - chuyển bst sang mảng python

Viết một chương trình Python để chuyển đổi một phần tử mảng nhất định thành Cây tìm kiếm nhị phân cân bằng chiều cao (BST).

Lưu ý: Sắp xếp lựa chọn cải thiện trên loại bong bóng bằng cách chỉ thực hiện một trao đổi cho mỗi lần vượt qua danh sách.

Giải pháp mẫu: Write a Python program to delete a node with the given key in a given Binary search tree (BST).
Next: Write a Python program to find the kth smallest element in a given a binary search tree.

Python: Lời khuyên trong ngày

Đặt tên và lưu lát cắt của Iterables:

# Naming slices (slice(start, end, step))
>>> a = [0, 1, 2, 3, 4, 5]
>>> LASTTHREE = slice(-3, None)
>>> LASTTHREE
slice(-3, None, None)
>>> a[LASTTHREE]
[3, 4, 5]

Xem thảo luận

Cải thiện bài viết

Lưu bài viết

  • Đọc
  • Bàn luận
  • Xem thảo luận

    Cải thiện bài viết

    Lưu bài viết

    Đọc

    Bàn luận

    Cho một mảng đại diện cho một cây theo cách mà các chỉ mục mảng là các giá trị trong các nút cây và giá trị mảng cung cấp cho nút cha của chỉ mục cụ thể đó (hoặc nút). Giá trị của chỉ mục nút gốc sẽ luôn là -1 vì không có cha mẹ cho root. Xây dựng biểu diễn liên kết tiêu chuẩn của cây nhị phân đã cho từ biểu diễn đã cho này. Hãy tham khảo để hiểu cách xây dựng cây nhị phân từ biểu diễn mảng cha mẹ đã cho.

    1. Các cách để đại diện cho: & nbsp;
    2. Cây có thể được biểu diễn theo hai cách như được liệt kê dưới đây:

    Biểu diễn nút động (biểu diễn liên kết).

    Hướng dẫn convert bst to array python - chuyển bst sang mảng python

    Illustration:

           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  

    Procedure:

    Biểu diễn mảng (biểu diễn tuần tự).father, left_son and right_son are the values of indices of the array.

    Bây giờ, chúng ta sẽ nói về đại diện tuần tự của cây. & NBSP; Để biểu diễn một cây bằng một mảng, việc đánh số các nút có thể bắt đầu từ 0, (N-1) hoặc 1 N N, hãy xem xét hình minh họa dưới đây như sau: (0—n-1) 

    if (say)father=p; 
    then left_son=(2*p)+1; 
    and right_son=(2*p)+2;

    Lưu ý: Cha, trái_SON và RIGHT_SON là các giá trị của các chỉ số của mảng. 1—n

    if (say)father=p; 
    then left_son=(2*p); 
    and right_son=(2*p)+1; 

    Implementation:

    C++

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    0

    & nbsp; trường hợp 1: (0, n-1) & nbsp;

    Trường hợp 2: 1 - N

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    1
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    2
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    3

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    4
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    5

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    6
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    7
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    8

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    0

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    2

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    7
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    4
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    9

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    1
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    2
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    3
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    4

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    4
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    5

    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    6
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    0

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    2

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    4
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    5
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    8

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    0

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    if (say)father=p; 
    then left_son=(2*p)+1; 
    and right_son=(2*p)+2;
    0

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    7
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    4
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    9

    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    1
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    2
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    3
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    4

    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    6
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    0

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    Can't set child at 3 , no parent found
    Can't set child at 4 , no parent found
    A-C---F---
    0

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    4
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    5
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    8

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    8
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    4
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    0
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    2

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    Can't set child at 3 , no parent found
    Can't set child at 4 , no parent found
    A-C---F---
    8

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    7
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    4
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    9

    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    1
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    2
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    3
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    4

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    6
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    07
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    8

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    4
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    5

    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    19
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    20

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    0

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    19
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    6
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    25
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    8

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    7
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    4
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    9

    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    1
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    2
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    3
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    4

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    7
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    37
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    38

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    8
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    41
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    42

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    4
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    5

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    8
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    49
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    50

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    if (say)father=p; 
    then left_son=(2*p)+1; 
    and right_son=(2*p)+2;
    6
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    53
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    50

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    if (say)father=p; 
    then left_son=(2*p)+1; 
    and right_son=(2*p)+2;
    6
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    57
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    58

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    60

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    7
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    4
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    9

    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object): def __init__(self, x): self.val = x self.left = None self.right = None def array_to_bst(array_nums): if not array_nums: return None mid_num = len(array_nums)//2 node = TreeNode(array_nums[mid_num]) node.left = array_to_bst(array_nums[:mid_num]) node.right = array_to_bst(array_nums[mid_num+1:]) return node def preOrder(node): if not node: return print(node.val) preOrder(node.left) preOrder(node.right) array_nums = [1,2,3,4,5,6,7] print("Original array:") print(array_nums) result = array_to_bst(array_nums) print("\nArray to a height balanced BST:") print(preOrder(result)) 0class TreeNode(object): def __init__(self, x): self.val = x self.left = None self.right = None def array_to_bst(array_nums): if not array_nums: return None mid_num = len(array_nums)//2 node = TreeNode(array_nums[mid_num]) node.left = array_to_bst(array_nums[:mid_num]) node.right = array_to_bst(array_nums[mid_num+1:]) return node def preOrder(node): if not node: return print(node.val) preOrder(node.left) preOrder(node.right) array_nums = [1,2,3,4,5,6,7] print("Original array:") print(array_nums) result = array_to_bst(array_nums) print("\nArray to a height balanced BST:") print(preOrder(result)) 1 class TreeNode(object): def __init__(self, x): self.val = x self.left = None self.right = None def array_to_bst(array_nums): if not array_nums: return None mid_num = len(array_nums)//2 node = TreeNode(array_nums[mid_num]) node.left = array_to_bst(array_nums[:mid_num]) node.right = array_to_bst(array_nums[mid_num+1:]) return node def preOrder(node): if not node: return print(node.val) preOrder(node.left) preOrder(node.right) array_nums = [1,2,3,4,5,6,7] print("Original array:") print(array_nums) result = array_to_bst(array_nums) print("\nArray to a height balanced BST:") print(preOrder(result)) 2class TreeNode(object): def __init__(self, x): self.val = x self.left = None self.right = None def array_to_bst(array_nums): if not array_nums: return None mid_num = len(array_nums)//2 node = TreeNode(array_nums[mid_num]) node.left = array_to_bst(array_nums[:mid_num]) node.right = array_to_bst(array_nums[mid_num+1:]) return node def preOrder(node): if not node: return print(node.val) preOrder(node.left) preOrder(node.right) array_nums = [1,2,3,4,5,6,7] print("Original array:") print(array_nums) result = array_to_bst(array_nums) print("\nArray to a height balanced BST:") print(preOrder(result)) 3class TreeNode(object): def __init__(self, x): self.val = x self.left = None self.right = None def array_to_bst(array_nums): if not array_nums: return None mid_num = len(array_nums)//2 node = TreeNode(array_nums[mid_num]) node.left = array_to_bst(array_nums[:mid_num]) node.right = array_to_bst(array_nums[mid_num+1:]) return node def preOrder(node): if not node: return print(node.val) preOrder(node.left) preOrder(node.right) array_nums = [1,2,3,4,5,6,7] print("Original array:") print(array_nums) result = array_to_bst(array_nums) print("\nArray to a height balanced BST:") print(preOrder(result)) 4

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    4
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    5

    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    8
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    4
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    0
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    2

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    0
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    1
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    5
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    3
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    4

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
    if (say)father=p; 
    then left_son=(2*p)+1; 
    and right_son=(2*p)+2;
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    4
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    0
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    2

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    79

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    81
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    82
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    83

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    85
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    86
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    38

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    89__1901919191919138

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    95
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    96
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    91
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    1
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    38

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    89
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    02
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    91
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    1
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    38

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    95
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    08
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    91
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    2
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    38

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    13

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    71
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    18

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    75
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    222
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    0
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    8

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    75
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    27
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    82
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    29
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    30
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    31

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    74
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    76
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    35
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    0
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    37

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    74
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    76
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    41
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    43

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    79

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    48
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    2
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    50
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    1

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    1
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    55
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    56
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    57

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    58
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    59

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    60
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    61
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    62

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    60
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    64

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    0
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    79

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    58
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    71

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    74
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    76
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    79
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    43

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    79

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    48
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    2
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    50__12

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    1
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    55
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    56
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    57

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    58
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    59

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    60
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    61
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    62

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    60
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    64

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    0
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    79

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    58
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    71

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    74
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    76
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    79
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    43

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    79

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    48
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    2
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    50__12

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    74
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    76
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    17

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    60
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    35

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    10
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    11
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    24____1010____326
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    30
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    28

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    60
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    39
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    25
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    38

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    C#

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    58
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    1
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    31
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    56
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    4

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    58
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    0

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    1
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    48

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    79

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    81
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    82
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    83

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    85
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    86
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    38

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    89
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    90
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    46

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    95
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    96
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    50

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    89
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    02
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    50

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    74
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    71
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    72

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    13

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    71
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    18

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    75
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    222
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    0
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    8

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    75
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    27
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    82
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    29
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    30
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    31

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    74
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    76
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    35
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    0
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    37

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    79

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    06

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    74
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    76
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    41
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    43

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    79

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    79

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    1
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    55
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    56
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    57

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    58
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    26
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    27
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    28

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    0
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    79

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    0
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    79

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    58
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    71

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    74
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    76
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    79
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    43

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    79

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    48
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    2
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    50__12

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    1
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    55
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    56
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    57

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    58
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    26
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    27
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    28

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    0
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    79

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    58
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    71

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    74
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    76
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    79
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    43

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    79

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    48
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    2
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    50__12

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    74
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    76
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    17

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    60
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    88

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    58
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    0

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    60
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    26
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    25
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    38

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    6

    Python3

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    10
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    11
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    24____1010____326
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    30
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    28

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    58
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    1
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    31
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    56
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    4

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    58
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    0

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    18
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    11
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    7
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    4

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    1
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    48

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    74
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    71
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    72

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    74
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    75
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    76
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    56

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    95
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    08
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    58

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    75
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    93

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    0
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    16

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    75
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    27
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    82
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    98

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    74
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    76
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    02

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    95
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    08
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    58

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    75
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    6
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    93

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    0
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    16

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    75
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    27
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    82
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    98

    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    07
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    02

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    10
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    05
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    06
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    07
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    11
             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    30
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    10

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    1
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    13
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    01
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    03
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    16

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    58
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    18
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    19
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    01
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    21

    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    80
    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    0
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    16

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    58
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    18
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    11
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    25
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    29
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    01
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    21

    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    5
    # Naming slices (slice(start, end, step))
    >>> a = [0, 1, 2, 3, 4, 5]
    >>> LASTTHREE = slice(-3, None)
    >>> LASTTHREE
    slice(-3, None, None)
    >>> a[LASTTHREE]
    [3, 4, 5]
    
    18
           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    34

             15
          6
             14
       2
             13
          5
             11
    0
             10
          4
             9
       1
             8
          3
             7
    
    7
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    37
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    4

    if (say)father=p; 
    then left_son=(2*p)+1; 
    and right_son=(2*p)+2;
    6
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    45
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    91
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    0
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    4

    Original array:
    [1, 2, 3, 4, 5, 6, 7]
    
    Array to a height balanced BST:
    4
    2
    1
    3
    6
    5
    7
    None
    
    8
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    49
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    91
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    1
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    4

    if (say)father=p; 
    then left_son=(2*p)+1; 
    and right_son=(2*p)+2;
    6
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    53
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    91
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    1
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    4

    if (say)father=p; 
    then left_son=(2*p)+1; 
    and right_son=(2*p)+2;
    6
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    57
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    91
    a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
    
    def childNodes(i):
         return (2*i)+1, (2*i)+2
    
    def traversed(a, i=0, d = 0):
        if i >= len(a):
            return 
        l, r =  childNodes(i)
        traversed(a, r, d = d+1)
        print("   "*d + str(a[i]))
        traversed(a, l, d = d+1)
    
    traversed(a)
    
    2
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    def array_to_bst(array_nums):
        if not array_nums:
            return None
        mid_num = len(array_nums)//2
        node = TreeNode(array_nums[mid_num])
        node.left = array_to_bst(array_nums[:mid_num])
        node.right = array_to_bst(array_nums[mid_num+1:])
        return node
    
    def preOrder(node): 
        if not node: 
            return      
        print(node.val)
        preOrder(node.left) 
        preOrder(node.right)   
    
    array_nums = [1,2,3,4,5,6,7]
    
    print("Original array:")
    print(array_nums)
    result = array_to_bst(array_nums)
    print("\nArray to a height balanced BST:")
    print(preOrder(result))
    
    
    4

           A(0)    
         /   \
        B(1)  C(2)  
      /   \      \
     D(3)  E(4)   F(6) 
    OR,
          A(1)    
         /   \
        B(2)  C(3)  
      /   \      \
     D(4)  E(5)   F(7)  
    58

    Đầu ra

    Can't set child at 3 , no parent found
    Can't set child at 4 , no parent found
    A-C---F---

    Độ phức tạp về thời gian: O (log n) Vì sử dụng heap để tạo ra độ phức tạp của không gian nhị phân: O (n) cho mảng since using heap to create a binary tree
    Space complexity: O(n) for array


    Làm thế nào để bạn chuyển đổi một cây nhị phân thành một mảng trong Python?

    Trong trường hợp của một cây nhị phân, bạn sẽ phải thực hiện một đường ngang hàng. Và khi bạn tiếp tục đi qua, bạn sẽ phải lưu trữ các giá trị trong mảng theo thứ tự chúng xuất hiện trong thời gian truyền tải. Điều này sẽ giúp bạn khôi phục các thuộc tính của cây nhị phân và cũng sẽ duy trì thứ tự của các yếu tố.perform a level order traversal. And as you keep traversing, you'll have to store the values in the array in the order they appear during the traversal. This will help you in restoring the properties of a binary tree and will also maintain the order of elements.

    Làm thế nào để bạn tạo ra một mảng BST trong Python?

    Khoa học dữ liệu thực tế sử dụng Python..
    Nếu A trống, thì hãy trả lại null ..
    Tìm phần tử giữa và làm cho nó root ..
    Chia mảng thành hai mảng con, phần bên trái của phần tử giữa và phần bên phải của phần tử giữa ..
    Thực hiện đệ quy cùng một nhiệm vụ cho Subarray bên trái và Subarray bên phải ..

    Làm thế nào để bạn tạo ra một loạt các cây nhị phân?

    Có thể xây dựng một mảng từ một cây nhị phân ?..
    Đặt hàng trước: Thực hiện DFS bắt đầu từ gốc và lưu trữ các đỉnh theo thứ tự giống như bạn truy cập chúng.....
    In-Oder: Đơn đặt lại tất cả các đỉnh bên trái vào mảng, sau đó là chính của đỉnh, sau đó đệ quy các đỉnh của bên phải ..

    Mảng có phải là BST không?

    Cho một mảng đại diện cho một cây theo cách mà các chỉ mục mảng là các giá trị trong các nút cây và giá trị mảng cung cấp cho nút cha của chỉ mục cụ thể đó (hoặc nút).Giá trị của chỉ mục nút gốc sẽ luôn là -1 vì không có cha mẹ cho root.