别人的一个面试题

现在单表树结构如下
ID    PID      NAME
1      0        A
2      1        B
3      4        C
4      7        D
5      2        E
6      4        F
7      2        G
8      5        H
9      0        I
10     8        J
自定义orderTree函数,对以上数据进行排序,PID(父节点)等于0为根节点, 排序结果应为  A-B-E-H-J-G-D-C-F-I 排序规则: 从PID为0的节点开始排序,查找其子节点,直到遍历所有数据 要求保证算法简单,速度快,树结构可自行建立数据表或存于DATASET中

DataSet Set = new DataSet();
        DataTable dt = new DataTable("RoadTree");
        dt.Columns.Add("ID", typeof(int));
        dt.Columns.Add("PID", typeof(int));
        dt.Columns.Add("Name", typeof(string));

        DataRow row = null;

        //初始化四个父类记录
        #region 初始化四个父类记录
        row = dt.NewRow();
        row["ID"] = 1;
        row["PID"] = 0;
        row["Name"] = "A";
        dt.Rows.Add(row);

        row = dt.NewRow();
        row["ID"] = 2;
        row["PID"] = 1;
        row["RoadName"] = "B";
        dt.Rows.Add(row);

        row = dt.NewRow();
        row["ID"] = 3;
        row["PID"] = 4;
        row["Name"] = "C";
        dt.Rows.Add(row);
       
        ……………………

//以上是将所有的数据存至DataSet数据集中
//以下采用递归算法BindNode,来遍历所有的结点,并将结点绑定到DropDownList中
BindNode(this.DropDownList1, "0", Set);


//-----------BindNode递归算法如下:--------------//
private void BindNode(DropDownList Nds, string pNodeId, DataSet ds)
    {
        DataView dvTree = new DataView(ds.Tables[0]);

        dvTree.RowFilter = "[PID] = " + pNodeId;

        foreach (DataRowView Row in dvTree)
        {
            ListItem tempNode = new ListItem();
            tempNode.Value = Row["ID"].ToString();

            if (pNodeId != "0")
                tempNode.Text = "----" + Row["Name"].ToString();
            else
            {
                tempNode.Text = Row["Name"].ToString();
                tempNode.Attributes.Add("style", "background-color: #005A94;color:white;");
            }

            Nds.Items.Add(tempNode);

            //建立该结点的子节点;如果该节点还有其它子节点,就进行递归调用
            BindNode(Nds, Row["ID"].ToString(), ds);
        }
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值