Source code for jaclearn.nlp.tree.traversal

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# File   : traversal.py
# Author : Jiayuan Mao
# Email  : maojiayuan@gmail.com
# Date   : 07/04/2018
#
# This file is part of Jacinle.
# Distributed under terms of the MIT license.

"""
Tree traversal uilties.
"""

import jacinle.random as random
from jacinle.utils.enum import JacEnum

__all__ = ['TraversalOrder', 'traversal']


[docs]class TraversalOrder(JacEnum): PRE = 'pre' POST = 'post'
[docs]def traversal(root, order='pre'): order = TraversalOrder.from_string(order) def dfs(x): if order is TraversalOrder.PRE: yield x for c in x.children: yield from dfs(c) if order is TraversalOrder.POST: yield x return dfs(root)
def _shuffled(a): a = a.copy() random.shuffle_list(a) return a def random_traversal(root, order='pre'): order = TraversalOrder.from_string(order) def dfs(x): if order is TraversalOrder.PRE: yield x for c in _shuffled(x.children): yield from dfs(c) if order is TraversalOrder.POST: yield x return dfs(root) def is_binary_tree(root): for x in traversal(root): if not (x.is_leaf or x.nr_children == 2): return False return True class BinaryTraversalOrder(JacEnum): LR = 'lr' NLR = 'nlr' LNR = 'lnr' LRN = 'lrn' def binary_traversal(root, order='lnr'): order = BinaryTraversalOrder.from_string(order) def dfs(x): if x.is_leaf: yield x else: for x in order.val: if x == 'l': yield from dfs(x.lson) elif x == 'n': yield x elif x == 'r': yield from dfs(x.rson) return dfs(root)