在.Net framework下遍历XML文挡树的两种算法
在阅读ASP.NET_XML深入编程技术 (PDF格式)一书的时候,发现遍历树的两种算法:深度优先和广度优先遍历文挡树,前一种需要使用递归,后者则不需要,本人大学时期数据结构学的不好,每每涉及到树,总喜欢用递归,希望以后能根据需要选用一种,不过没有时间再系统地学习数据结构了,那就平时多学多记吧!
另外这个例子不错,还可以学到.net的XML DOM的一些操作方法.
1/// <summary>
2 /// 深度优先遍历文挡树(递归方法)
3 /// </summary>
4 /// <param name="currentNode">当前节点</param>
5 public void DOMDepthFirst(XmlNode currentNode)
6 {
7 XmlNode node = currentNode.FirstChild ;
8 while ( node != null )
9 {
10 DOMDepthFirst( node ) ;
11 node = node.NextSibling ;
12 }
13
14 //do something else with currentNode herer
15 }
2 /// 深度优先遍历文挡树(递归方法)
3 /// </summary>
4 /// <param name="currentNode">当前节点</param>
5 public void DOMDepthFirst(XmlNode currentNode)
6 {
7 XmlNode node = currentNode.FirstChild ;
8 while ( node != null )
9 {
10 DOMDepthFirst( node ) ;
11 node = node.NextSibling ;
12 }
13
14 //do something else with currentNode herer
15 }
1 /// <summary>
2 /// 广度优先遍历文挡树(非递归)
3 /// </summary>
4 /// <param name="root">遍历的入口点,如果需要遍历整个文挡则是XmlDocument对象</param>
5 public void DOMBreadthFirst(XmlNode root)
6 {
7 Queue queue = new Queue() ;
8 queue.Enqueue(root) ;
9 XmlNode currentNode = null ;
10 try
11 {
12 while (true)
13 {
14 //如果queue为空,则抛错,跳出try section,这里是while循环的退出条件
15 currentNode = (XmlNode)queue.Dequeue() ;
16
17 if (currentNode.HasChildNodes)
18 {
19 foreach (XmlNode child in currentNode.ChildNodes)
20 {
21 queue.Enqueue(child) ;
22 }
23 }
24 }
25 }
26 catch(System.InvalidOperationException ex)
27 {
28 //throw ex ;
29 }
30 }
31
32
2 /// 广度优先遍历文挡树(非递归)
3 /// </summary>
4 /// <param name="root">遍历的入口点,如果需要遍历整个文挡则是XmlDocument对象</param>
5 public void DOMBreadthFirst(XmlNode root)
6 {
7 Queue queue = new Queue() ;
8 queue.Enqueue(root) ;
9 XmlNode currentNode = null ;
10 try
11 {
12 while (true)
13 {
14 //如果queue为空,则抛错,跳出try section,这里是while循环的退出条件
15 currentNode = (XmlNode)queue.Dequeue() ;
16
17 if (currentNode.HasChildNodes)
18 {
19 foreach (XmlNode child in currentNode.ChildNodes)
20 {
21 queue.Enqueue(child) ;
22 }
23 }
24 }
25 }
26 catch(System.InvalidOperationException ex)
27 {
28 //throw ex ;
29 }
30 }
31
32
使用方法:
XmlDocument doc = new XmlDocument() ;
doc.Load("test.xml") ;
DOMDepthFirst(doc) ;
DOMBreadthFirst(doc) ;