前言
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; }
}
总结
仅作为记录提供思路,该方法在单个文字串长度过长时,由于文字串的坐标不会改变,会产生误差。