traverse.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:4k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: traverse.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:10:16  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: traverse.cpp,v 1000.1 2004/06/01 18:10:16 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author:  Richard Desper
  35. *
  36. * File Description:  traverse.cpp
  37. *
  38. *    A part of the Miminum Evolution algorithm
  39. *
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <stdio.h>
  43. #include <stdlib.h>
  44. #include <math.h>
  45. #include "graph.h"
  46. #include "fastme.h"
  47. BEGIN_NCBI_SCOPE
  48. BEGIN_SCOPE(fastme)
  49. meEdge *findBottomLeft(meEdge *e)
  50.      /*findBottomLeft searches by gottom down in the meTree and to the left.*/
  51. {
  52.   meEdge *f;
  53.   f = e;
  54.   while (NULL != f->head->leftEdge)
  55.     f = f->head->leftEdge;
  56.   return(f);  
  57. }
  58.   
  59. meEdge *moveRight(meEdge *e)
  60. {
  61.   meEdge *f;
  62.   f = e->tail->rightEdge; /*this step moves from a left-oriented edge
  63.     to a right-oriented edge*/
  64.   if (NULL != f)
  65.     f = findBottomLeft(f);
  66.   return(f);
  67. }
  68. meEdge *depthFirstTraverse(meTree *T, meEdge *e)
  69.      /*depthFirstTraverse returns the meEdge f which is least in T according
  70.        to the depth-first order, but which is later than e in the search
  71.        pattern.  If e is null, f is the least meEdge of T*/
  72. {
  73.   meEdge *f;
  74.   if (NULL == e)
  75.     {
  76.       f = T->root->leftEdge;   
  77.       if (NULL != f)
  78. f = findBottomLeft(f); 
  79.       return(f);  /*this is the first meEdge of this search pattern*/
  80.     }
  81.   else /*e is non-null*/
  82.     {
  83.       if (e->tail->leftEdge == e) 
  84. /*if e is a left-oriented edge, we skip the entire
  85.   meTree cut below e, and find least edge*/
  86. f = moveRight(e);
  87.       else  /*if e is a right-oriented edge, we have already looked at its
  88.       sibling and everything below e, so we move up*/
  89. f = e->tail->parentEdge;
  90.     }
  91.   return(f);
  92. }
  93.         
  94. meEdge *moveUpRight(meEdge *e)
  95. {
  96.   meEdge *f;
  97.   f = e;
  98.   while ((NULL != f) && ( f->tail->leftEdge != f))
  99.     f = f->tail->parentEdge;
  100.   /*go up the meTree until f is a leftEdge*/
  101.   if (NULL == f)
  102.     return(f); /*triggered at end of search*/
  103.   else
  104.     return(f->tail->rightEdge);      
  105.   /*and then go right*/
  106. }
  107.   
  108. boolean leaf(meNode *v);
  109. meEdge *topFirstTraverse(meTree *T, meEdge *e)
  110.      /*topFirstTraverse starts from the top of T, and from there moves stepwise
  111.        down, left before right*/
  112.      /*assumes meTree has been detrifurcated*/
  113. {
  114.   meEdge *f;
  115.   if (NULL == e)
  116.     return(T->root->leftEdge); /*first Edge searched*/
  117.   else if (!(leaf(e->head)))
  118.     return(e->head->leftEdge); /*down and to the left is preferred*/
  119.   else /*e->head is a leaf*/
  120.     {
  121.       f = moveUpRight(e);
  122.       return(f);
  123.     }
  124. }
  125. END_SCOPE(fastme)
  126. END_NCBI_SCOPE
  127. /*
  128.  * ===========================================================================
  129.  * $Log: traverse.cpp,v $
  130.  * Revision 1000.1  2004/06/01 18:10:16  gouriano
  131.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  132.  *
  133.  * Revision 1.2  2004/05/21 21:41:04  gorelenk
  134.  * Added PCH ncbi_pch.hpp
  135.  *
  136.  * Revision 1.1  2004/02/10 15:16:04  jcherry
  137.  * Initial version
  138.  *
  139.  * ===========================================================================
  140.  */