如何C#中实现在TreeView查找某一节点
2006-03-29 14:11
786 查看
在TreeView查找某一节点,通常有两种方法,一种是递归的,一种不是递归,但都是深度优先算法。其中,非递归方法效率高些,而递归算法要简洁一些。
第一种,递归算法,代码如下:
[align=left] private TreeNode FindNode( TreeNode tnParent, string strValue )[/align]
[align=left] {[/align]
[align=left] if( tnParent == null ) return null;[/align]
[align=left] if( tnParent.Text == strValue ) return tnParent;[/align]
[align=left] [/align]
[align=left] TreeNode tnRet = null;[/align]
[align=left] foreach( TreeNode tn in tnParent.Nodes )[/align]
[align=left] {[/align]
[align=left] tnRet = FindNodeExt( tn, strValue );[/align]
[align=left] if( tnRet != null ) break;[/align]
[align=left] }[/align]
[align=left] return tnRet;[/align]
[align=left] }[/align]
第二种,非递归算法,代码如下:
[align=left] private TreeNode FindNode( TreeNode tnParent, string strValue )[/align]
[align=left] {[/align]
[align=left] if( tnParent == null ) return null;[/align]
[align=left] [/align]
[align=left] if( tnParent.Text == strValue ) return tnParent;[/align]
[align=left] else if( tnParent.Nodes.Count == 0 ) return null;[/align]
[align=left] [/align]
[align=left] TreeNode tnCurrent, tnCurrentPar;[/align]
[align=left] [/align]
//Init node
[align=left] tnCurrentPar = tnParent;[/align]
[align=left] tnCurrent = tnCurrentPar.FirstNode;[/align]
[align=left] [/align]
[align=left] while( tnCurrent != null && tnCurrent != tnParent )[/align]
[align=left] {[/align]
[align=left] while( tnCurrent != null )[/align]
[align=left] {[/align]
[align=left] if( tnCurrent.Text == strValue ) return tnCurrent;[/align]
[align=left] else if( tnCurrent.Nodes.Count > 0 ) [/align]
[align=left] {[/align]
[align=left] //Go into the deepest node in current sub-path[/align]
[align=left] tnCurrentPar = tnCurrent;[/align]
[align=left] tnCurrent = tnCurrent.FirstNode;[/align]
[align=left] }[/align]
[align=left] else if( tnCurrent != tnCurrentPar.LastNode )[/align]
[align=left] {[/align]
[align=left] //Goto next sible node [/align]
[align=left] tnCurrent = tnCurrent.NextNode;[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] break;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] //Go back to parent node till its has next sible node[/align]
[align=left] while( tnCurrent != tnParent && tnCurrent == tnCurrentPar.LastNode )[/align]
[align=left] {[/align]
[align=left] tnCurrent = tnCurrentPar;[/align]
[align=left] tnCurrentPar = tnCurrentPar.Parent;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] //Goto next sible node[/align]
[align=left] if( tnCurrent != tnParent )[/align]
[align=left] tnCurrent = tnCurrent.NextNode;[/align]
[align=left] }[/align]
[align=left] return null;[/align]
[align=left] }[/align]
程序调用,如下:
[align=left] TreeNode tnRet = null;[/align]
[align=left] foreach( TreeNode tn in yourTreeView.Nodes )[/align]
[align=left] {[/align]
[align=left] tnRet = FindNodeExt( tn, yourValue );[/align]
[align=left] if( tnRet != null ) break;[/align]
[align=left] }[/align]
第一种,递归算法,代码如下:
[align=left] private TreeNode FindNode( TreeNode tnParent, string strValue )[/align]
[align=left] {[/align]
[align=left] if( tnParent == null ) return null;[/align]
[align=left] if( tnParent.Text == strValue ) return tnParent;[/align]
[align=left] [/align]
[align=left] TreeNode tnRet = null;[/align]
[align=left] foreach( TreeNode tn in tnParent.Nodes )[/align]
[align=left] {[/align]
[align=left] tnRet = FindNodeExt( tn, strValue );[/align]
[align=left] if( tnRet != null ) break;[/align]
[align=left] }[/align]
[align=left] return tnRet;[/align]
[align=left] }[/align]
第二种,非递归算法,代码如下:
[align=left] private TreeNode FindNode( TreeNode tnParent, string strValue )[/align]
[align=left] {[/align]
[align=left] if( tnParent == null ) return null;[/align]
[align=left] [/align]
[align=left] if( tnParent.Text == strValue ) return tnParent;[/align]
[align=left] else if( tnParent.Nodes.Count == 0 ) return null;[/align]
[align=left] [/align]
[align=left] TreeNode tnCurrent, tnCurrentPar;[/align]
[align=left] [/align]
//Init node
[align=left] tnCurrentPar = tnParent;[/align]
[align=left] tnCurrent = tnCurrentPar.FirstNode;[/align]
[align=left] [/align]
[align=left] while( tnCurrent != null && tnCurrent != tnParent )[/align]
[align=left] {[/align]
[align=left] while( tnCurrent != null )[/align]
[align=left] {[/align]
[align=left] if( tnCurrent.Text == strValue ) return tnCurrent;[/align]
[align=left] else if( tnCurrent.Nodes.Count > 0 ) [/align]
[align=left] {[/align]
[align=left] //Go into the deepest node in current sub-path[/align]
[align=left] tnCurrentPar = tnCurrent;[/align]
[align=left] tnCurrent = tnCurrent.FirstNode;[/align]
[align=left] }[/align]
[align=left] else if( tnCurrent != tnCurrentPar.LastNode )[/align]
[align=left] {[/align]
[align=left] //Goto next sible node [/align]
[align=left] tnCurrent = tnCurrent.NextNode;[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] break;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] //Go back to parent node till its has next sible node[/align]
[align=left] while( tnCurrent != tnParent && tnCurrent == tnCurrentPar.LastNode )[/align]
[align=left] {[/align]
[align=left] tnCurrent = tnCurrentPar;[/align]
[align=left] tnCurrentPar = tnCurrentPar.Parent;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] //Goto next sible node[/align]
[align=left] if( tnCurrent != tnParent )[/align]
[align=left] tnCurrent = tnCurrent.NextNode;[/align]
[align=left] }[/align]
[align=left] return null;[/align]
[align=left] }[/align]
程序调用,如下:
[align=left] TreeNode tnRet = null;[/align]
[align=left] foreach( TreeNode tn in yourTreeView.Nodes )[/align]
[align=left] {[/align]
[align=left] tnRet = FindNodeExt( tn, yourValue );[/align]
[align=left] if( tnRet != null ) break;[/align]
[align=left] }[/align]
相关文章推荐
- C#中如何实现在TreeView模糊查找某一节点
- 如何C#中实现在TreeView查找某一节点(两种方法)
- 如何C#中实现在TreeView查找某一节点(转)
- 如何C#中实现在TreeView查找某一节点
- 如何C#中实现在TreeView查找某一节点(两种方法)
- 如何C#中实现在TreeView查找某一节点
- 如何在C#中实现treeview查找某一节点
- <转>如何C#中实现在TreeView查找某一节点
- 如何C#中实现在TreeView查找某一节点
- 如何C#中实现在TreeView查找某一节点(两种方法)
- 用C#在ASP.NET 2.0 的 TreeView 中查找某一节点
- 【转】C#中 TreeView如何获取某一节点下的所有子节点
- ASP.NET 2005 C#如何在TreeView中设置节点之间的间距,节点上下间距?
- C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考
- TreeView节点拖放/DragDrop的实现实例(C#)
- C#中遍历TreeView并查找和选定节点
- C# TreeView实现拖动节点时滚动条自动滚动
- [原创]在TreeView中如何实现第一层的节点,第二层的节点,点击的时候都不PostBack,第三层的节点点击的时候,能够PostBack
- WPF如何实现TreeView节点重命名
- c# 实现鼠标拖动TreeView节点