关于这个算法大概有两个常用的方法,一个就是递归,一个非递归的(呵呵,好像是废话哈),递归写起来可能代码比较简洁,但是效率不高,非递归方法写起来不是很容易,但是效率较递归来说很有优势,下面我就说一下我在这方面的两个方法(这是现在我做项目体会到的)。
先看看我用的
递归方法
,整体思路是:首先对根节点下的所有子节点做一个循环,在循环体里边,①判断该子节点是否是叶节点,是的话就移除该节点,并且将子节点数count减一,计数器i也减一,否则就递归调用方法traverse ( childNode )并重新获取该节点的子节点数(childCount = childNode.ChildNodes.Count;)②判断该节点的子节点数是否为0,是的话就移除该节点
//
获得TreeView的根节点
TreeNode
node = TreeView.Nodes [0];
//
递归方法
traverse ( node );
///
<summary>
///
递归移除所有选中的节点
///</summary>
///<param name="parentNode"></param>
private void traverse ( TreeNode parentNode )
{
int count = parentNode.ChildNodes.Count;
for ( int i = 0 ; i < count ; i++ )
{
TreeNode childNode = parentNode.ChildNodes [i];
//
移除之前的子节点数
int childCount = childNode.ChildNodes.Count;
//
移除算法
if ( childCount > 0 )
{
//
递归调用
traverse ( childNode );
//
移除之后剩余的子节点
childCount = childNode.ChildNodes.Count;
}
else if ( childNode.ChildNodes.Count == 0 && childNode.Checked )
{
//
您要做的其他操作
//
移除被选中的节点
parentNode.ChildNodes.Remove ( childNode );
--count;
--i;
}
//
移除被选中的父节点(如果父节点的子节点数为0,父节点也要移除)
if ( childCount == 0 )
{
parentNode.ChildNodes.Remove ( childNode );
--count;
--i;
}
}
}
下面是非递归算法
,整体思路是循环访问TreeView里边的选中的节点的集合的第一个节点(
checkBoxes [0]
),①如果
checkBoxes [0]
不是叶节点,就将其选中状态设为false,而不移除②如果checkBoxes [0]是叶节点,判断其父节点的子节点数是否为1,是的话就将checkBoxes [0]的父节点设置为要移除的节点(父节点被移除,子节点也会跟着被移除,于是达到了移除只有一个子节点的父节点的子节点时联动移除该子节点的父节点的目的),再去判断它的父节点的父节点的子节点数是否为1(while ( node.Parent.ChildNodes.Count == 1 ))……如此循环,最后移除当前的节点,那么该节点下的所有子节点都会被移除
//
非递归方法
RemoveCheckedNodes ( TreeView);
///
<summary>
///
清除选中的节点并更新数据库
///</summary>
///<param name="tree"></param>
private void RemoveCheckedNodes ( TreeView tree )
{
//
获取所有选中的节点集合
TreeNodeCollection checkBoxes = tree.CheckedNodes;
while ( checkBoxes.Count > 0 )
{
//
判断checkBoxes [0]节点是否是叶节点
if (checkBoxes [0]
不是叶节点 )
{
checkBoxes [0].Checked = false;
}
else if (checkBoxes [0]
是叶节点 )
{
//
您要做的其他操作
//
声明当前选中节点为要移除的节点
TreeNode node = checkBoxes [0];
//
循环判断节点的父节点的所有子节点数是否为1
//
是的话就设父节点为要移除的节点
while ( node.Parent.ChildNodes.Count == 1 )
{
node = node.Parent;
}
//
移除节点
TreeNode parentNode = node.Parent;
parentNode.ChildNodes.Remove ( node );
}
}
}