算法题,不用递归,构造树型

刚发了今天上午的面试题,最后一道算法题,我又看了一下,貌似真不太好实现,要在一个方法中构造整颗树,还不能使用递归.我先把自己的实现发上来,希望能起来抛砖引玉的作用.
8.算法题.
表结构:
ID        ParentID      Text
1          NULL           Root
2          1                 A1
3           1                A2
4           2                B
5           4                C
把以下程序补充完整.
public class TreeNode{.........}
public class Test
{
    public TreeNode LoadTreeNodeFromDatabase(string connectionString){.......}
    /*********************
输出结果如下:
Root
-A1
--B
---C
-A2
   **********************/
public void Print(TreeNode nod){..........}

}
我的实现如下,
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Data.SqlClient;

namespace ConsoleApplication2
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            Test t 
= new Test();
            TreeNode tree 
= t.LoadTreeNodeFromDatabase("server=.\\SQLExpress;uid=sa;pwd=sa;database=ksl");
            t.Print(tree);
            Console.Read();
        }

    }

    
public class TreeNode
    
{
        
int _ID = 0;
        
int _ParentID = 0;
        
string _Text = "";
        List
<TreeNode> nodes = new List<TreeNode>();

        
public TreeNode()
        
{ }
        
public TreeNode(int id, int parentid, string text)
        
{
            _ID 
= id;
            _ParentID 
= parentid;
            _Text 
= text;
        }

        
public int ID
        
{
            
get return _ID; }
            
set { _ID = value; }
        }

        
public int ParentID
        
{
            
get return _ParentID; }
            
set { _ParentID = value; }
        }

        
public string Text
        
{
            
get return _Text; }
            
set { _Text = value; }
        }

        
public List<TreeNode> Nodes
        
{
            
get return nodes; }
        }

    }

    
public class Test
    
{
        
public TreeNode LoadTreeNodeFromDatabase(string connectionString)
        
{
            
using (SqlConnection conn = new SqlConnection(connectionString))
            
{
                SqlCommand cmd 
= new SqlCommand("SELECT ID,ParentID,Text FROM TblTree", conn);
                conn.Open();
                SqlDataReader reader 
= cmd.ExecuteReader();
                Dictionary
<string, TreeNode> dict = new Dictionary<string, TreeNode>();
                
while (reader.Read())
                
{
                    
int parentID = 0;
                    
if (reader["ParentID"!= DBNull.Value)
                        parentID 
= Convert.ToInt32(reader["ParentID"]);
                    TreeNode node 
= new TreeNode(Convert.ToInt32(reader["ID"]), parentID, reader["Text"].ToString());
                    dict.Add(node.ID.ToString(), node);
                }

                reader.Close();
                conn.Close();

                TreeNode tree;
                tree 
= dict["1"];
                
foreach (string str in dict.Keys)
                
{
                    
if (str == "1"continue;
                    TreeNode node 
= dict[str];
                    TreeNode parentNode 
= dict[node.ParentID.ToString()];
                    
if (parentNode != null)
                        parentNode.Nodes.Add(node);
                }

                
return tree;
            }

        }


        
/***************************************************************
     
         Root
         -A1
         --B
         ---C
         -A2 
          **************************************************************
*/

        
public void Print(TreeNode node)
        
{
            
if (node.ParentID != 0)
            
{
                
for (int i = 0; i < node.ParentID; i++)
                
{
                    Console.Write(
"-");
                }

            }

            Console.WriteLine(node.Text);
            
foreach (TreeNode treeNode in node.Nodes)
                Print(treeNode);
        }

    }


}

小奎的石头已经扔出来了...
Tag标签: 算法,递归,树型
posted @ 2008-05-21 15:47 bqrm_521(小奎) 阅读(557) 评论(11)  编辑 收藏 所属分类: Asp.Net

  回复  引用    
#1楼 2008-05-21 15:53 | 为啥没了呢? [未注册用户]
沙发
  回复  引用  查看    
#2楼 2008-05-21 16:01 | 坏人      
这叫不用递归?!
  回复  引用  查看    
#3楼 [楼主]2008-05-21 16:02 | bqrm_521(小奎)      
不好意思.构造树没有问题,但是输出有问题.没法正确的输出"-".可能需要在TreeNode里面存一个字段.
  回复  引用  查看    
#4楼 [楼主]2008-05-21 16:04 | bqrm_521(小奎)      
@坏人
...
  回复  引用  查看    
#5楼 [楼主]2008-05-21 16:05 | bqrm_521(小奎)      
@为啥没了呢?
:-)
  回复  引用  查看    
#6楼 2008-05-21 16:05 | 瑞克梅塔      
什么地方面试,搞这么麻烦的题,直接走人啦
  回复  引用  查看    
#7楼 [楼主]2008-05-21 16:07 | bqrm_521(小奎)      
@瑞克梅塔
大望路那边.就有一个朋友,没有做题,直接走了.不过,我没有那魄力啊.哈哈哈

不过,当时,我没做出这道题来,回来后,费了一小时才做出来.
  回复  引用  查看    
#8楼 2008-05-21 16:17 | 张东杰      
foreach (TreeNode treeNode in node.Nodes)
Print(treeNode);
2楼没说错,最后面递归了
  回复  引用  查看    
#9楼 2008-05-21 16:20 | 飞扬跋扈      
判RootNode似乎应该是用parent == null,而不是直接用1.
Print消除尾递归。。。。。。。。。
  回复  引用  查看    
#10楼 [楼主]2008-05-21 16:28 | bqrm_521(小奎)      
@张东杰
嗯.不过,我是说不用递归构造树型,输出用递归,不算.:)
  回复  引用  查看    
#11楼 [楼主]2008-05-21 16:31 | bqrm_521(小奎)      
@飞扬跋扈
嗯.你说的那样好一些.

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-05-21 15:59 编辑过


相关链接: