C#递归构成树结构


前言

C#递归生成树的算法

一、如图将文字互相靠近的合并成一棵树,共生成三棵树

在这里插入图片描述

二、代码如下

主函数

    //存放所有树的list
                var treelist = new List<Tree>();
                foreach (var text in cADTexts) {
                    var copy = cADTexts.ToArray().ToList();
                   
                    //将使用过的text移除
                    foreach (var item in treelist) {
                        foreach (var item2 in item.UsedTexts) {
                            copy.Remove(item2);
                        }
                    }
                    if (copy.Count == 0) { break; }
                    var tree = new Tree(copy[0], copy);
                    tree.Construct();
                    treelist.Add(tree);
                }

树类和节点类

class Tree {
        public Tree(CADTextModel StartText, List<CADTextModel> AllTexts)
        {
            this.AllTexts = AllTexts;
            this.startNode = new TextNode() { Parent = null, Text = StartText };
            this.UsedTexts = new List<CADTextModel>();
            this.UsedTexts.Add(StartText);
        }
        //需要从中找距离小于0.5的元素
        public List<CADTextModel> AllTexts { get; set; }
        //已经使用过的元素
        public List<CADTextModel> UsedTexts { get; set; }
        
        public TextNode startNode { get; set; }

        public void Construct() {
            AppendChildren(startNode);
            foreach (var child in startNode.Children) {
                Construct(child);
            }
        
        }
        //构造树
        public void Construct(TextNode textNode) {
            AppendChildren(textNode);
            foreach (var child in textNode.Children) {
                Construct(child);
            }
        }
        //添加子节点 同时记录下使用过的text
        public void AppendChildren(TextNode textNode)
        {
            var copy = AllTexts.ToArray().ToList();
            foreach (var item in UsedTexts) {
                copy.Remove(item);
                
            }
            foreach (var t in copy)
            {
                if (t.Location.DistanceTo(textNode.Text.Location) < 0.5)
                {
                    textNode.Children.Add(new TextNode() { Parent = textNode, Text = t });
                    AllTexts.Remove(t);
                    UsedTexts.Add(t);
                }
            }
        }
    }

    class TextNode {
        public TextNode()
        {
            Children = new List<TextNode>();
        }
        List<CADTextModel> AllTexts = new List<CADTextModel>();
        public TextNode Parent { get; set; }

        public CADTextModel Text { get; set; }

        public List<TextNode> Children { get; set; }
    }

总结

仅作为记录提供思路,该方法在单个文字串长度过长时,由于文字串的坐标不会改变,会产生误差。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//设定生成树的原始数据 void getdatable() { tblDatas.Columns.Add("groupid", Type.GetType("System.String")); tblDatas.Columns.Add("groupname", Type.GetType("System.String")); tblDatas.Columns.Add("parentid", Type.GetType("System.String")); tblDatas.Rows.Add(new object[] { "1", "机关", "0" }); tblDatas.Rows.Add(new object[] { "2", "学院", "0" }); tblDatas.Rows.Add(new object[] { "3", "教学管理中心", "1" }); tblDatas.Rows.Add(new object[] { "4", "校园管理中心", "1" }); tblDatas.Rows.Add(new object[] { "5", "数据中心", "3" }); tblDatas.Rows.Add(new object[] { "6", "信息中心", "3" }); tblDatas.Rows.Add(new object[] { "7", "一卡通", "4" }); tblDatas.Rows.Add(new object[] { "8", "保卫处", "4" }); tblDatas.Rows.Add(new object[] { "9", "信工系", "2" }); tblDatas.Rows.Add(new object[] { "10", "艺术系", "2" }); dataGridView1.DataSource = tblDatas; } //归生成树函数 public void AddTree(int ParentID, TreeNode pNode) { DataTable dt = new DataTable(); dt = tblDatas; DataView dvTree = new DataView(dt); //过滤ParentID,得到当前的所有子节点 dvTree.RowFilter = "parentid = " + ParentID; foreach (DataRowView Row in dvTree) { TreeNode Node = new TreeNode(); if (pNode == null) { //添加根节点 Node.Text = Row["groupname"].ToString(); treeView1.Nodes.Add(Node); AddTree(Int32.Parse(Row["groupid"].ToString()), Node); //再次归 } else { //添加当前节点的子节点 Node.Text = Row["groupname"].ToString(); pNode.Nodes.Add(Node); AddTree(Int32.Parse(Row["groupid"].ToString()), Node); //再次归 } } } //调用归函数在treeView1里面显示给出数据的树形图 private void button1_Click(object sender, EventArgs e) { treeView1.Nodes.Clear(); AddTree(0, (TreeNode)null); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值