Returns a stream of pairs of node addresses and data, raising
        AddressNotInTree if ADDRESS is not in the tree.

        First the ancestors of ADDRESS (including itself) are yielded,
        earliest to latest, and then the descendants of ADDRESS are
        yielded in an unspecified order.

        Arguments:
            address (str): the address to be walked

def walk(self, address):
        '''
        Returns a stream of pairs of node addresses and data, raising
        AddressNotInTree if ADDRESS is not in the tree.

        First the ancestors of ADDRESS (including itself) are yielded,
        earliest to latest, and then the descendants of ADDRESS are
        yielded in an unspecified order.

        Arguments:
            address (str): the address to be walked
        '''

        for step in self._walk_to_address(address):
            node = step
            yield node.address, node.data

        to_process = deque()

        to_process.extendleft(
            node.children)

        while to_process:
            node = to_process.pop()

            yield node.address, node.data

            if node.children:
                to_process.extendleft(
                    node.children)