技术开发 频道

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


【IT168技术文档】

  刚发了今天上午的面试题,最后一道算法题,我又看了一下,貌似真不太好实现,要在一个方法中构造整颗树,还不能使用递归.我先把自己的实现发上来,希望能起来抛砖引玉的作用.
算法题. 表结构: 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); } } }
0
相关文章