コード例 #1
0
void
boundary_traversal(node_t *root)
{
    node_t *tmp=root, *tmp1=root;
    
    while(tmp->left != NULL)
    {
	printf("[%d]   ", tmp->data);
	tmp = tmp->left;
    }

    traverse_leaves(root);
    
    /* This is going to print tree right nodes in clock wise direction which is not required.
     * so using traverse_right(node_t *root) which will print right nodes in anti-clockwise 
     * direction.
     */
    /*
    while(tmp1->right != NULL)
    {
	printf("[%d]    ", tmp1->data);
	tmp1 = tmp1->right;
    }
    */
    traverse_right(tmp1);

    printf("[NULL]\n");
    return;
}
コード例 #2
0
void
traverse_right(node_t *root)
{
    if(root && root->right)
    {
	traverse_right(root->right);
	printf("[%d]    ", root->data);
    }
}
コード例 #3
0
ファイル: collins.hpp プロジェクト: hitochan777/cicada
      size_type find_head(const hypergraph_type& graph, const edge_type& edge, const symbol_type& parent) const
      {
	typedef std::vector<symbol_type, std::allocator<symbol_type> > symbol_set_type;
	typedef std::vector<int, std::allocator<int> > index_set_type;
	
	const symbol_type& mother = edge.rule->lhs;
	
	category_info_type::const_iterator citer = categories.find(mother);
	if (citer == categories.end())
	  return size_type(-1);

	symbol_set_type rhs;
	index_set_type  index;
	
	{
	  rule_type::symbol_set_type::const_iterator riter_begin = edge.rule->rhs.begin();
	  rule_type::symbol_set_type::const_iterator riter_end   = edge.rule->rhs.end();
	  for (rule_type::symbol_set_type::const_iterator riter = riter_begin; riter != riter_end; ++ riter)
	    if (riter->is_non_terminal()) {
	      rhs.push_back(*riter);
	      index.push_back(riter - riter_begin);
	    }
	}

	symbol_set_type::const_iterator riter_begin = rhs.begin();
	symbol_set_type::const_iterator riter_end   = rhs.end();
	
	category_map_type::const_iterator iter_begin = citer->second.begin();
	category_map_type::const_iterator iter_end   = citer->second.end();
	for (category_map_type::const_iterator iter = iter_begin; iter != iter_end; ++ iter) {
	  const bool fallback = (iter == iter_end - 1);

	  symbol_set_type::const_iterator riter = riter_end;
	  
	  switch (iter->first) {
	  case left:        riter = traverse_left(iter->second, riter_begin, riter_end); break;
	  case leftdis:     riter = traverse_leftdis(iter->second, riter_begin, riter_end); break;
	  case leftexcept:  riter = traverse_leftexcept(iter->second, riter_begin, riter_end); break;
	  case right:       riter = traverse_right(iter->second, riter_begin, riter_end); break;
	  case rightdis:    riter = traverse_rightdis(iter->second, riter_begin, riter_end); break;
	  case rightexcept: riter = traverse_rightexcept(iter->second, riter_begin, riter_end); break;
	  }
	  
	  if (riter == riter_end && fallback)
	    switch (iter->first) {
	    case left:
	    case leftdis:
	    case leftexcept:
	      riter = riter_begin;
	      break;
	    case right:
	    case rightdis:
	    case rightexcept:
	      riter = riter_end - 1;
	      break;
	    }
	  
	  if (riter != riter_end) {

	    if (riter >= riter_begin + 2) {
	      const symbol_type cat_prev = (riter - 1)->non_terminal();
	      
	      if (cat_prev == "[CC]" || cat_prev == "[CONJP]") {
		symbol_set_type::const_iterator riter_new = skip_pre_terminals(graph, edge.tails, riter_begin, riter - 1, riter_end);
		
		if (riter_new != riter_end)
		  riter = riter_new;
	      }
	    }
	    
	    return index[riter - riter_begin];
	  }
	}
	
	return size_type(-1);
      }