Example #1
0
            return 0

        dl = self.printkDistanceNode(root.left, target, k)

        if dl != -1:

            if dl + 1 == k:
                print(root.val)

            else:
                self.printkDistanceNodeDown(root.right, k - dl - 2)

            return 1 + dl

        dr = self.printkDistanceNode(root.right, target, k)
        if dr != -1:
            if (dr + 1 == k):
                print(root.val)
            else:
                self.printkDistanceNodeDown(root.left, k - dr - 2)
            return 1 + dr

        return -1


sol = Solution()
root: Node = TreeHelper.create_tree(
    [3, 5, 1, 6, 2, 9, 8, None, None, 7, 4, None, None, None, None])
TreeHelper.print_tree(root)
sol.printkDistanceNode(root, root.left, 2)
        self.first_min, self.second_min = maxsize, maxsize

        self.traverse_pre_order(root)

        return self.second_min if self.second_min < maxsize else -1

    def traverse_pre_order(self, node: Node):

        if not node or not node.val:
            return

        if node.val < self.first_min:
            self.first_min = node.val
        elif self.first_min < node.val < self.second_min:
            self.second_min = node.val

        self.traverse_pre_order(node.left)
        self.traverse_pre_order(node.right)


sol = Solution()

tree = TreeHelper.create_tree([2, 2, 5, None, None, 5, 7])
TreeHelper.print_tree(tree)
assert sol.findSecondMinimumValue(tree) == 5

tree = TreeHelper.create_tree([2, 2, 2])
TreeHelper.print_tree(tree)
assert sol.findSecondMinimumValue(tree) == -1