本文整理汇总了C++中Tree::IsLeaf方法的典型用法代码示例。如果您正苦于以下问题:C++ Tree::IsLeaf方法的具体用法?C++ Tree::IsLeaf怎么用?C++ Tree::IsLeaf使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Tree
的用法示例。
在下文中一共展示了Tree::IsLeaf方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: SubFamRecurse
static unsigned SubFamRecurse(const Tree &tree, unsigned uNodeIndex, unsigned uMaxLeafCount,
unsigned SubFams[], unsigned &uSubFamCount)
{
if (tree.IsLeaf(uNodeIndex))
return 1;
unsigned uLeft = tree.GetLeft(uNodeIndex);
unsigned uRight = tree.GetRight(uNodeIndex);
unsigned uLeftCount = SubFamRecurse(tree, uLeft, uMaxLeafCount, SubFams, uSubFamCount);
unsigned uRightCount = SubFamRecurse(tree, uRight, uMaxLeafCount, SubFams, uSubFamCount);
unsigned uLeafCount = uLeftCount + uRightCount;
if (uLeftCount + uRightCount > uMaxLeafCount)
{
if (uLeftCount <= uMaxLeafCount)
SubFams[uSubFamCount++] = uLeft;
if (uRightCount <= uMaxLeafCount)
SubFams[uSubFamCount++] = uRight;
}
else if (tree.IsRoot(uNodeIndex))
{
if (uSubFamCount != 0)
Quit("Error in SubFamRecurse");
SubFams[uSubFamCount++] = uNodeIndex;
}
return uLeafCount;
}
示例2: PhyEnumBiParts
bool PhyEnumBiParts(const Tree &tree, PhyEnumEdgeState &ES,
unsigned Leaves1[], unsigned *ptruCount1,
unsigned Leaves2[], unsigned *ptruCount2)
{
bool bOk = PhyEnumEdges(tree, ES);
if (!bOk)
{
*ptruCount1 = 0;
*ptruCount2 = 0;
return false;
}
// Special case: in a rooted tree, both edges from the root
// give the same bipartition, so skip one of them.
if (tree.IsRooted() && tree.IsRoot(ES.m_uNodeIndex2)
&& tree.GetRight(ES.m_uNodeIndex2) == ES.m_uNodeIndex1)
{
bOk = PhyEnumEdges(tree, ES);
if (!bOk)
return false;
}
PhyGetLeaves(tree, ES.m_uNodeIndex1, ES.m_uNodeIndex2, Leaves1, ptruCount1);
PhyGetLeaves(tree, ES.m_uNodeIndex2, ES.m_uNodeIndex1, Leaves2, ptruCount2);
if (*ptruCount1 + *ptruCount2 != tree.GetLeafCount())
Quit("PhyEnumBiParts %u + %u != %u",
*ptruCount1, *ptruCount2, tree.GetLeafCount());
#if DEBUG
{
for (unsigned i = 0; i < *ptruCount1; ++i)
{
if (!tree.IsLeaf(Leaves1[i]))
Quit("PhyEnumByParts: not leaf");
for (unsigned j = 0; j < *ptruCount2; ++j)
{
if (!tree.IsLeaf(Leaves2[j]))
Quit("PhyEnumByParts: not leaf");
if (Leaves1[i] == Leaves2[j])
Quit("PhyEnumByParts: dupe");
}
}
}
#endif
return true;
}
示例3: SetInFam
static void SetInFam(const Tree &tree, unsigned uNodeIndex, bool NodeInSubFam[])
{
if (tree.IsLeaf(uNodeIndex))
return;
unsigned uLeft = tree.GetLeft(uNodeIndex);
unsigned uRight = tree.GetRight(uNodeIndex);
NodeInSubFam[uLeft] = true;
NodeInSubFam[uRight] = true;
SetInFam(tree, uLeft, NodeInSubFam);
SetInFam(tree, uRight, NodeInSubFam);
}
示例4: BuildDiffs
static void BuildDiffs(const Tree &tree, unsigned uTreeNodeIndex,
const bool bIsDiff[], Tree &Diffs, unsigned uDiffsNodeIndex,
unsigned IdToDiffsLeafNodeIndex[])
{
#if TRACE
Log("BuildDiffs(TreeNode=%u IsDiff=%d IsLeaf=%d)\n",
uTreeNodeIndex, bIsDiff[uTreeNodeIndex], tree.IsLeaf(uTreeNodeIndex));
#endif
if (bIsDiff[uTreeNodeIndex])
{
unsigned uLeafCount = tree.GetLeafCount();
unsigned *Leaves = new unsigned[uLeafCount];
GetLeaves(tree, uTreeNodeIndex, Leaves, &uLeafCount);
for (unsigned n = 0; n < uLeafCount; ++n)
{
const unsigned uLeafNodeIndex = Leaves[n];
const unsigned uId = tree.GetLeafId(uLeafNodeIndex);
if (uId >= tree.GetLeafCount())
Quit("BuildDiffs, id out of range");
IdToDiffsLeafNodeIndex[uId] = uDiffsNodeIndex;
#if TRACE
Log(" Leaf id=%u DiffsNode=%u\n", uId, uDiffsNodeIndex);
#endif
}
delete[] Leaves;
return;
}
if (tree.IsLeaf(uTreeNodeIndex))
Quit("BuildDiffs: should never reach leaf");
const unsigned uTreeLeft = tree.GetLeft(uTreeNodeIndex);
const unsigned uTreeRight = tree.GetRight(uTreeNodeIndex);
const unsigned uDiffsLeft = Diffs.AppendBranch(uDiffsNodeIndex);
const unsigned uDiffsRight = uDiffsLeft + 1;
BuildDiffs(tree, uTreeLeft, bIsDiff, Diffs, uDiffsLeft, IdToDiffsLeafNodeIndex);
BuildDiffs(tree, uTreeRight, bIsDiff, Diffs, uDiffsRight, IdToDiffsLeafNodeIndex);
}
示例5: ClusterBySubfamCount_Iteration
static void ClusterBySubfamCount_Iteration(const Tree &tree, unsigned Subfams[],
unsigned uCount)
{
// Find highest child node of current set of subfamilies.
double dHighestHeight = -1e20;
int iParentSubscript = -1;
for (int n = 0; n < (int) uCount; ++n)
{
const unsigned uNodeIndex = Subfams[n];
if (tree.IsLeaf(uNodeIndex))
continue;
const unsigned uLeft = tree.GetLeft(uNodeIndex);
const double dHeightLeft = tree.GetNodeHeight(uLeft);
if (dHeightLeft > dHighestHeight)
{
dHighestHeight = dHeightLeft;
iParentSubscript = n;
}
const unsigned uRight = tree.GetRight(uNodeIndex);
const double dHeightRight = tree.GetNodeHeight(uRight);
if (dHeightRight > dHighestHeight)
{
dHighestHeight = dHeightRight;
iParentSubscript = n;
}
}
if (-1 == iParentSubscript)
Quit("CBSFCIter: failed to find highest child");
const unsigned uNodeIndex = Subfams[iParentSubscript];
const unsigned uLeft = tree.GetLeft(uNodeIndex);
const unsigned uRight = tree.GetRight(uNodeIndex);
// Delete parent by replacing with left child
Subfams[iParentSubscript] = uLeft;
// Append right child to list
Subfams[uCount] = uRight;
#if TRACE
{
Log("Iter %3u:", uCount);
for (unsigned n = 0; n < uCount; ++n)
Log(" %u", Subfams[n]);
Log("\n");
}
#endif
}
示例6: GetInternalNodesInHeightOrder
void GetInternalNodesInHeightOrder(const Tree &tree, unsigned NodeIndexes[])
{
const unsigned uNodeCount = tree.GetNodeCount();
if (uNodeCount < 3)
Quit("GetInternalNodesInHeightOrder: %u nodes, none are internal",
uNodeCount);
const unsigned uInternalNodeCount = (uNodeCount - 1)/2;
double *Heights = new double[uInternalNodeCount];
unsigned uIndex = 0;
for (unsigned uNodeIndex = 0; uNodeIndex < uNodeCount; ++uNodeIndex)
{
if (tree.IsLeaf(uNodeIndex))
continue;
NodeIndexes[uIndex] = uNodeIndex;
Heights[uIndex] = tree.GetNodeHeight(uNodeIndex);
++uIndex;
}
if (uIndex != uInternalNodeCount)
Quit("Internal error: GetInternalNodesInHeightOrder");
// Simple but slow bubble sort (probably don't care about speed here)
bool bDone = false;
while (!bDone)
{
bDone = true;
for (unsigned i = 0; i < uInternalNodeCount - 1; ++i)
{
if (Heights[i] > Heights[i+1])
{
double dTmp = Heights[i];
Heights[i] = Heights[i+1];
Heights[i+1] = dTmp;
unsigned uTmp = NodeIndexes[i];
NodeIndexes[i] = NodeIndexes[i+1];
NodeIndexes[i+1] = uTmp;
bDone = false;
}
}
}
#if TRACE
Log("Internal node index Height\n");
Log("------------------- --------\n");
// 1234567890123456789 123456789
for (unsigned n = 0; n < uInternalNodeCount; ++n)
Log("%19u %9.3f\n", NodeIndexes[n], Heights[n]);
#endif
delete[] Heights;
}
示例7: GetNextNodeIndex
static unsigned GetNextNodeIndex(const Tree &tree, unsigned uPrevNodeIndex)
{
if (g_bStable)
{
const unsigned uNodeCount = tree.GetNodeCount();
unsigned uNodeIndex = uPrevNodeIndex;
for (;;)
{
++uNodeIndex;
if (uNodeIndex >= uNodeCount)
return NULL_NEIGHBOR;
if (tree.IsLeaf(uNodeIndex))
return uNodeIndex;
}
}
unsigned uNodeIndex = uPrevNodeIndex;
for (;;)
{
uNodeIndex = tree.NextDepthFirstNode(uNodeIndex);
if (NULL_NEIGHBOR == uNodeIndex || tree.IsLeaf(uNodeIndex))
return uNodeIndex;
}
}
示例8: GetLeavesRecurse
static void GetLeavesRecurse(const Tree &tree, unsigned uNodeIndex,
unsigned Leaves[], unsigned &uLeafCount /* in-out */)
{
if (tree.IsLeaf(uNodeIndex))
{
Leaves[uLeafCount] = uNodeIndex;
++uLeafCount;
return;
}
const unsigned uLeft = tree.GetLeft(uNodeIndex);
const unsigned uRight = tree.GetRight(uNodeIndex);
GetLeavesRecurse(tree, uLeft, Leaves, uLeafCount);
GetLeavesRecurse(tree, uRight, Leaves, uLeafCount);
}
示例9: CountLeaves
static unsigned CountLeaves(const Tree &tree, unsigned uNodeIndex,
unsigned LeavesUnderNode[])
{
if (tree.IsLeaf(uNodeIndex))
{
LeavesUnderNode[uNodeIndex] = 1;
return 1;
}
const unsigned uLeft = tree.GetLeft(uNodeIndex);
const unsigned uRight = tree.GetRight(uNodeIndex);
const unsigned uRightCount = CountLeaves(tree, uRight, LeavesUnderNode);
const unsigned uLeftCount = CountLeaves(tree, uLeft, LeavesUnderNode);
const unsigned uCount = uRightCount + uLeftCount;
LeavesUnderNode[uNodeIndex] = uCount;
return uCount;
}
示例10: GetLeavesSubtree
static void GetLeavesSubtree(const Tree &tree, unsigned uNodeIndex1,
const unsigned uNodeIndex2, unsigned Leaves[], unsigned *ptruCount)
{
if (tree.IsLeaf(uNodeIndex1))
{
Leaves[*ptruCount] = uNodeIndex1;
++(*ptruCount);
return;
}
const unsigned uLeft = tree.GetFirstNeighbor(uNodeIndex1, uNodeIndex2);
const unsigned uRight = tree.GetSecondNeighbor(uNodeIndex1, uNodeIndex2);
if (NULL_NEIGHBOR != uLeft)
GetLeavesSubtree(tree, uLeft, uNodeIndex1, Leaves, ptruCount);
if (NULL_NEIGHBOR != uRight)
GetLeavesSubtree(tree, uRight, uNodeIndex1, Leaves, ptruCount);
}
示例11: GetLeavesSubtreeExcluding
static void GetLeavesSubtreeExcluding(const Tree &tree, unsigned uNodeIndex,
unsigned uExclude, unsigned Leaves[], unsigned *ptruCount)
{
if (uNodeIndex == uExclude)
return;
if (tree.IsLeaf(uNodeIndex))
{
Leaves[*ptruCount] = uNodeIndex;
++(*ptruCount);
return;
}
const unsigned uLeft = tree.GetLeft(uNodeIndex);
const unsigned uRight = tree.GetRight(uNodeIndex);
if (NULL_NEIGHBOR != uLeft)
GetLeavesSubtreeExcluding(tree, uLeft, uExclude, Leaves, ptruCount);
if (NULL_NEIGHBOR != uRight)
GetLeavesSubtreeExcluding(tree, uRight, uExclude, Leaves, ptruCount);
}
示例12: CalcInfo
static void CalcInfo(const Tree &tree, unsigned uNode1, unsigned uNode2, EdgeInfo **EIs)
{
const unsigned uNeighborIndex = tree.GetNeighborSubscript(uNode1, uNode2);
EdgeInfo &EI = EIs[uNode1][uNeighborIndex];
EI.m_uNode1 = uNode1;
EI.m_uNode2 = uNode2;
if (tree.IsLeaf(uNode2))
{
EI.m_dMaxDistToLeaf = 0;
EI.m_dTotalDistToLeaves = 0;
EI.m_uMaxStep = NULL_NEIGHBOR;
EI.m_uMostDistantLeaf = uNode2;
EI.m_uLeafCount = 1;
EI.m_bSet = true;
return;
}
double dMaxDistToLeaf = -1e29;
double dTotalDistToLeaves = 0.0;
unsigned uLeafCount = 0;
unsigned uMostDistantLeaf = NULL_NEIGHBOR;
unsigned uMaxStep = NULL_NEIGHBOR;
const unsigned uNeighborCount = tree.GetNeighborCount(uNode2);
for (unsigned uSub = 0; uSub < uNeighborCount; ++uSub)
{
const unsigned uNode3 = tree.GetNeighbor(uNode2, uSub);
if (uNode3 == uNode1)
continue;
const EdgeInfo &EINext = EIs[uNode2][uSub];
if (!EINext.m_bSet)
Quit("CalcInfo: internal error, dist %u->%u not known",
uNode2, uNode3);
uLeafCount += EINext.m_uLeafCount;
const double dEdgeLength = tree.GetEdgeLength(uNode2, uNode3);
const double dTotalDist = EINext.m_dTotalDistToLeaves +
EINext.m_uLeafCount*dEdgeLength;
dTotalDistToLeaves += dTotalDist;
const double dDist = EINext.m_dMaxDistToLeaf + dEdgeLength;
if (dDist > dMaxDistToLeaf)
{
dMaxDistToLeaf = dDist;
uMostDistantLeaf = EINext.m_uMostDistantLeaf;
uMaxStep = uNode3;
}
}
if (NULL_NEIGHBOR == uMaxStep || NULL_NEIGHBOR == uMostDistantLeaf ||
0 == uLeafCount)
Quit("CalcInfo: internal error 2");
const double dThisDist = tree.GetEdgeLength(uNode1, uNode2);
EI.m_dMaxDistToLeaf = dMaxDistToLeaf;
EI.m_dTotalDistToLeaves = dTotalDistToLeaves;
EI.m_uMaxStep = uMaxStep;
EI.m_uMostDistantLeaf = uMostDistantLeaf;
EI.m_uLeafCount = uLeafCount;
EI.m_bSet = true;
}
示例13: RootByMidLongestSpan
static void RootByMidLongestSpan(const Tree &tree, EdgeInfo **EIs,
unsigned *ptruNode1, unsigned *ptruNode2,
double *ptrdLength1, double *ptrdLength2)
{
const unsigned uNodeCount = tree.GetNodeCount();
unsigned uLeaf1 = NULL_NEIGHBOR;
unsigned uMostDistantLeaf = NULL_NEIGHBOR;
double dMaxDist = -VERY_LARGE_DOUBLE;
for (unsigned uNodeIndex = 0; uNodeIndex < uNodeCount; ++uNodeIndex)
{
if (!tree.IsLeaf(uNodeIndex))
continue;
const unsigned uNode2 = tree.GetNeighbor1(uNodeIndex);
if (NULL_NEIGHBOR == uNode2)
Quit("RootByMidLongestSpan: internal error 0");
const double dEdgeLength = tree.GetEdgeLength(uNodeIndex, uNode2);
const EdgeInfo &EI = EIs[uNodeIndex][0];
if (!EI.m_bSet)
Quit("RootByMidLongestSpan: internal error 1");
if (EI.m_uNode1 != uNodeIndex || EI.m_uNode2 != uNode2)
Quit("RootByMidLongestSpan: internal error 2");
const double dSpanLength = dEdgeLength + EI.m_dMaxDistToLeaf;
if (dSpanLength > dMaxDist)
{
dMaxDist = dSpanLength;
uLeaf1 = uNodeIndex;
uMostDistantLeaf = EI.m_uMostDistantLeaf;
}
}
if (NULL_NEIGHBOR == uLeaf1)
Quit("RootByMidLongestSpan: internal error 3");
const double dTreeHeight = dMaxDist/2.0;
unsigned uNode1 = uLeaf1;
unsigned uNode2 = tree.GetNeighbor1(uLeaf1);
double dAccumSpanLength = 0;
#if TRACE
Log("RootByMidLongestSpan: span=%u", uLeaf1);
#endif
for (;;)
{
const double dEdgeLength = tree.GetEdgeLength(uNode1, uNode2);
#if TRACE
Log("->%u(%g;%g)", uNode2, dEdgeLength, dAccumSpanLength);
#endif
if (dAccumSpanLength + dEdgeLength >= dTreeHeight)
{
*ptruNode1 = uNode1;
*ptruNode2 = uNode2;
*ptrdLength1 = dTreeHeight - dAccumSpanLength;
*ptrdLength2 = dEdgeLength - *ptrdLength1;
#if TRACE
{
const EdgeInfo &EI = EIs[uLeaf1][0];
Log("...\n");
Log("Midpoint: Leaf1=%u Leaf2=%u Node1=%u Node2=%u Length1=%g Length2=%g\n",
uLeaf1, EI.m_uMostDistantLeaf, *ptruNode1, *ptruNode2, *ptrdLength1, *ptrdLength2);
}
#endif
return;
}
if (tree.IsLeaf(uNode2))
Quit("RootByMidLongestSpan: internal error 4");
dAccumSpanLength += dEdgeLength;
const unsigned uSub = tree.GetNeighborSubscript(uNode1, uNode2);
const EdgeInfo &EI = EIs[uNode1][uSub];
if (!EI.m_bSet)
Quit("RootByMidLongestSpan: internal error 5");
uNode1 = uNode2;
uNode2 = EI.m_uMaxStep;
}
}
示例14: DoMuscle
//.........这里部分代码省略.........
Quit("Input file '%s' has no sequences", g_pstrInFileName);
if (1 == uSeqCount)
{
TextFile fileOut(g_pstrOutFileName, true);
v.ToFile(fileOut);
return;
}
if (uSeqCount > 1)
MHackStart(v);
// First iteration
Tree GuideTree;
if (0 != g_pstrUseTreeFileName)
{
// Discourage users...
if (!g_bUseTreeNoWarn)
fprintf(stderr, "%s", g_strUseTreeWarning);
// Read tree from file
TextFile TreeFile(g_pstrUseTreeFileName);
GuideTree.FromFile(TreeFile);
// Make sure tree is rooted
if (!GuideTree.IsRooted())
Quit("User tree must be rooted");
if (GuideTree.GetLeafCount() != uSeqCount)
Quit("User tree does not match input sequences");
const unsigned uNodeCount = GuideTree.GetNodeCount();
for (unsigned uNodeIndex = 0; uNodeIndex < uNodeCount; ++uNodeIndex)
{
if (!GuideTree.IsLeaf(uNodeIndex))
continue;
const char *LeafName = GuideTree.GetLeafName(uNodeIndex);
unsigned uSeqIndex;
bool SeqFound = v.FindName(LeafName, &uSeqIndex);
if (!SeqFound)
Quit("Label %s in tree does not match sequences", LeafName);
unsigned uId = v.GetSeqIdFromName(LeafName);
GuideTree.SetLeafId(uNodeIndex, uId);
}
}
else
TreeFromSeqVect(v, GuideTree, g_Cluster1, g_Distance1, g_Root1,
g_pstrDistMxFileName1);
const char *Tree1 = ValueOpt("Tree1");
if (0 != Tree1)
{
TextFile f(Tree1, true);
GuideTree.ToFile(f);
if (g_bClusterOnly)
return;
}
SetMuscleTree(GuideTree);
ValidateMuscleIds(GuideTree);
MSA msa;
msa.SetCompositeVector(CVLocation);
ProgNode *ProgNodes = 0;
if (g_bLow)
ProgNodes = ProgressiveAlignE(v, GuideTree, msa);
else
示例15: DiffTrees
void DiffTrees(const Tree &Tree1, const Tree &Tree2, Tree &Diffs,
unsigned IdToDiffsLeafNodeIndex[])
{
#if TRACE
Log("Tree1:\n");
Tree1.LogMe();
Log("\n");
Log("Tree2:\n");
Tree2.LogMe();
#endif
if (!Tree1.IsRooted() || !Tree2.IsRooted())
Quit("DiffTrees: requires rooted trees");
const unsigned uNodeCount = Tree1.GetNodeCount();
const unsigned uNodeCount2 = Tree2.GetNodeCount();
const unsigned uLeafCount = Tree1.GetLeafCount();
const unsigned uLeafCount2 = Tree2.GetLeafCount();
assert(uLeafCount == uLeafCount2);
if (uNodeCount != uNodeCount2)
Quit("DiffTrees: different node counts");
// Allocate tables so we can convert tree node index to
// and from the unique id with a O(1) lookup.
unsigned *NodeIndexToId1 = new unsigned[uNodeCount];
unsigned *IdToNodeIndex2 = new unsigned[uNodeCount];
bool *bIsBachelor1 = new bool[uNodeCount];
bool *bIsDiff1 = new bool[uNodeCount];
for (unsigned uNodeIndex = 0; uNodeIndex < uNodeCount; ++uNodeIndex)
{
NodeIndexToId1[uNodeIndex] = uNodeCount;
bIsBachelor1[uNodeIndex] = false;
bIsDiff1[uNodeIndex] = false;
// Use uNodeCount as value meaning "not set".
IdToNodeIndex2[uNodeIndex] = uNodeCount;
}
// Initialize node index <-> id lookup tables
for (unsigned uNodeIndex = 0; uNodeIndex < uNodeCount; ++uNodeIndex)
{
if (Tree1.IsLeaf(uNodeIndex))
{
const unsigned uId = Tree1.GetLeafId(uNodeIndex);
if (uId >= uNodeCount)
Quit("Diff trees requires existing leaf ids in range 0 .. (N-1)");
NodeIndexToId1[uNodeIndex] = uId;
}
if (Tree2.IsLeaf(uNodeIndex))
{
const unsigned uId = Tree2.GetLeafId(uNodeIndex);
if (uId >= uNodeCount)
Quit("Diff trees requires existing leaf ids in range 0 .. (N-1)");
IdToNodeIndex2[uId] = uNodeIndex;
}
}
// Validity check. This verifies that the ids
// pre-assigned to the leaves in Tree1 are unique
// (note that the id<N check above does not rule
// out two leaves having duplicate ids).
for (unsigned uId = 0; uId < uLeafCount; ++uId)
{
unsigned uNodeIndex2 = IdToNodeIndex2[uId];
if (uNodeCount == uNodeIndex2)
Quit("DiffTrees, check 2");
}
// Ids assigned to internal nodes are N, N+1 ...
// An internal node id uniquely identifies a set
// of two or more leaves.
unsigned uInternalNodeId = uLeafCount;
// Depth-first traversal of tree.
// The order guarantees that a node is visited before
// its parent is visited.
for (unsigned uNodeIndex1 = Tree1.FirstDepthFirstNode();
NULL_NEIGHBOR != uNodeIndex1;
uNodeIndex1 = Tree1.NextDepthFirstNode(uNodeIndex1))
{
#if TRACE
Log("Main loop: Node1=%u IsLeaf=%d IsBachelor=%d\n",
uNodeIndex1,
Tree1.IsLeaf(uNodeIndex1),
bIsBachelor1[uNodeIndex1]);
#endif
// Leaves are trivial; nothing to do.
if (Tree1.IsLeaf(uNodeIndex1) || bIsBachelor1[uNodeIndex1])
continue;
// If either child is a bachelor, flag
// this node as a bachelor and continue.
unsigned uLeft1 = Tree1.GetLeft(uNodeIndex1);
if (bIsBachelor1[uLeft1])
//.........这里部分代码省略.........