更改/导航到树的特定节点

本文关键字:节点 导航 更改 | 更新日期: 2023-09-27 18:19:06

我正在尝试更改树的特定节点,但我被难住了。我知道可以获取和返回树中节点的算法,但我的目标是实际更改该树中节点的值。

因此,例如,如果我们有一个树,其中每个项目都具有 Name 属性

Root
+Node 1
++Node 1_1
++Node 1_2
++...
+Node 2
++Node 2_1
++Node 2_2
++..

我想更改节点 1.2 的名称,我会像这样: Root.Node1.Node1_2.Name = "New Name"; 但是我将如何以编程方式执行此操作?就我而言,我得到了对象节点 1_2,我想在树中更改它。


忘了提到我正在使用的数据结构是我自己的数据结构,它有一个父级和一个子项列表。

应该重新表述我想要实现的目标。给定上面的树结构(它可以具有无限的深度,尽管没有说明(,并且给定一个已知在树中的任意对象,我将如何访问树中的元素并修改它?也就是说,我将如何以编程方式实现类似于以下内容的内容:Root.Node 1.Node 1_1_2.Node 1_1_2_4.Node 1_1_2_N.Name?

让我知道是否还有任何困惑?

更改/导航到树的特定节点

如果你的意思是Winforms TreeViews,每个TreeNode都有一个Nodes属性,其中包含一个可以使用的字符串索引器,前提是你已经设置并知道Node名称/键:

TreeView tv = new TreeView();
tv.Nodes.Add("a", "Albert");
tv.Nodes["a"].Nodes.Add("v", "Victoria");
tv.Nodes["a"].Nodes["v"].Text = "Peggy";

请注意,您甚至可以更改这些名称/键,新值现在将起作用:

tv.Nodes["a"].Name = "Al";
tv.Nodes["Al"].Text = "Bundy";

当然,现在旧的将不起作用:

tv.Nodes["a"].Text = "Bud"; // <-- now throws a NullObjectReference!

这是我提出的解决方案,但我觉得应该有一种更优雅的方法。

    public static void Rename(Node the_node, string new_name)
    {
            List<Node> parent_list = new List<Node>();
            Node current_node = the_node;
            parent_list.Add(current_node);
            while (current_node.ParentNode != null)
            {
                parent_list.Add(current_node.ParentNode);
                current_node = the_node.ParentNode;
            }
            Rename(ref the_node, parent_list, new_name);
    }
    private static void Rename(ref Node target_node, List<Node> traverse_order, string new_name)
    {
        if (traverse_order.Count > 0)
        {
            Node current_node = traverse_order.Last();
            traverse_order.RemoveAt(traverse_order.Count - 1);
            EditNode(ref current_node, traverse_order);
        }
        else
        {
            target_node.Name = new_name;
        }
    }