예제 #1
0
from BinaryTree import TreeNode, listtoTreeNode, prettyPrintTree

def preorderTraversal(root):
    preorder = []
    stack = []
    if root is None: return preorder
    stack.append(root)
    while len(stack) > 0:
        curr = stack.pop()
        preorder.append(curr.val)
        if curr.right: stack.append(curr.right)
        if curr.left: stack.append(curr.left)
    return preorder

if __name__ == '__main__':
    tree = [5, 4, 7, 3, 6, None, 2, None, -1, 2, None, None,  9]
    root = listtoTreeNode(tree)
    prettyPrintTree(root)
    preorder = preorderTraversal(root)
    print(preorder)
예제 #2
0
from BinaryTree import prettyPrintTree, listtoTreeNode


def maxDepth(root):
    if root is None: return 0

    depth = 1 + max(maxDepth(root.left), maxDepth(root.right))
    return depth


if __name__ == '__main__':
    root = listtoTreeNode([3, 9, 20, None, None, 15, 7])
    prettyPrintTree(root)
    print(maxDepth(root))
예제 #3
0

def isSymmetric(root):
    def isMirror(left, right):
        if left is None and right is None: return True
        if left is None or right is None: return False

        return left.val == right.val and isMirror(
            left.left, right.right) and isMirror(left.right, right.left)

    if root is None: return True
    return isMirror(root.left, root.right)


def isSymmetric2(root):
    if root is None: return True
    stack = [(root.left, root.right)]
    while stack:
        left, right = stack.pop()
        if left is None and right is None: continue
        if left is None or right is None: return False
        if left.val != right.val: return False
        stack.append((left.left, right.right))
        stack.append((left.right, right.left))
    return True


if __name__ == '__main__':
    root = listtoTreeNode([1, 2, 2, None, 4, 4, None])
    prettyPrintTree(root)
    print(isSymmetric2(root))
예제 #4
0
from BinaryTree import listtoTreeNode, prettyPrintTree
def levelOrder(root):
    output = []
    if root is None: return output
    queue = []
    queue.append(root)
    while len(queue) > 0:
        level_size = len(queue)
        nodes_in_level = []
        for _ in range(level_size):
            node = queue.pop(0)
            nodes_in_level.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        output.append(nodes_in_level)
    return output

if __name__ == '__main__':
    l = [3,9,20,None,None,15,7]
    root = listtoTreeNode(l)
    prettyPrintTree(root)
    print(levelOrder(root))
    l = []
    root = listtoTreeNode(l)
    prettyPrintTree(root)
    print(levelOrder(root))
예제 #5
0
from BinaryTree import prettyPrintTree, listtoTreeNode


def zigzagLevelOrder(root):
    levels = []
    if root is None: return levels
    queue = []
    queue.append(root)
    while len(queue) > 0:
        level = []
        n = len(queue)
        for _ in range(n):
            node = queue.pop(0)
            level.append(node.val)
            if node.left: queue.append(node.left)
            if node.right: queue.append(node.right)
        levels.append(level)

    for i, _ in enumerate(levels):
        if i % 2 == 1:
            levels[i] = levels[i][::-1]
    return levels


if __name__ == '__main__':
    # root = listtoTreeNode([3,9,20,4,6,15,7])
    # prettyPrintTree(root)
    # print(zigzagLevelOrder(root))
    root = listtoTreeNode([1, 2, 3, 4, None, None, 5])
    prettyPrintTree(root)
    print(zigzagLevelOrder(root))
예제 #6
0
    def isValidBST_helper(root, MIN, MAX):
        if root is None: return True
        if (root.val > MIN and root.val < MAX
                and isValidBST_helper(root.left, MIN, root.val)
                and isValidBST_helper(root.right, root.val, MAX)):
            return True
        return False

    MIN = float('-inf')
    MAX = float('inf')
    return isValidBST_helper(root, MIN, MAX)


def isValidBST2(root):
    curr = root
    stack = []
    prev_val = float("-inf")
    while stack or curr:
        while curr:
            stack.append(curr)
            curr = curr.left
        node = stack.pop()
        if prev_val >= node.val: return False
        prev_val = node.val
        curr = node.right
    return True


if __name__ == '__main__':
    root = listtoTreeNode([1, 0, 2])
    print(isValidBST2(root))