Solution 1

Python
from collections import deque
class Node:
    def __init__(self, val: int = -1, height: int = -1):
        self.val: int = val
        self.height: int = height
        self.left: Node | None = None
        self.right: Node | None = None
        
class Tree:
    def __init__(self, arr: list = []):
        self.root = Node(1, 1)
        queue: deque = deque([(self.root, 2)])
        i: int = 0
        while queue and i < len(arr):
            (root, childHeight) = queue.popleft()
            [left, right] = arr[i]
            if left > -1:
                root.left = Node(left, childHeight)
                queue.append((root.left, childHeight+1))
            if right > -1:
                root.right = Node(right, childHeight)
                queue.append((root.right, childHeight+1))
            i += 1
        print()
    
    def __inOrderTraversal(self, root, output) -> list:
        if not root:
            return output
        output = self.__inOrderTraversal(root.left, output)
        output.append(root.val)
        output = self.__inOrderTraversal(root.right, output)
        return output
        
    def getInOrderListRecursive(self) -> list:
        return self.__inOrderTraversal(self.root, [])
        
    def getInOrderListIterative(self) -> list:
        stack, result = [], []
        current = self.root
        while stack or current:
            while current:
                stack.append(current)
                current = current.left
            current = stack.pop()
            result.append(current.val)
            current = current.right
        return result

    def __preOrderTraversal(self, root, output) -> list:
        if not root:
            return output
        output.append(root.val)
        output = self.__preOrderTraversal(root.left, output)
        output = self.__preOrderTraversal(root.right, output)
        return output
    
    def getPreOrderListRecursive(self) -> list:
        return self.__preOrderTraversal(self.root, [])
    
    def getLevelOrderPairs(self) -> list:
        output: list = []
        queue: deque = deque([self.root])
        while queue:
            root = queue.popleft()
            left, right = -1, -1
            if root.left:
                left = root.left.val
                queue.append(root.left)
            if root.right:
                right = root.right.val
                queue.append(root.right)
            output.append([left, right])
        return output
    
    def swap(self, height: int = 1) -> None:
        queue: deque = deque([self.root])
        while queue:
            root: Node = queue.popleft()
            if root.height % height == 0:
                root.left, root.right = root.right, root.left
            if root.left:
                queue.append(root.left)
            if root.right:
                queue.append(root.right)

def swapNodes(indexes, queries):
    # Write your code here
    tree = Tree(indexes)
    output = []
    for query in queries:
        tree.swap(query)
        output.append(tree.getInOrderListIterative())
    return output
Hacker Rank/python.py · L160–272