从最后一个叶到另一个反向迭代TreeView节点的算法

时间:2011-02-09 04:55:50

标签: c# .net winforms algorithm treeview

将WinForms TreeView控件从最后一个叶子迭代到反向根的最佳算法是什么? C#

3 个答案:

答案 0 :(得分:5)

下面的代码将访问每个节点并完全遍历它,深度优先,直到它到达一个叶子。然后,当它展开堆栈时,将为每个节点调用DoSomethingWithNodedepth参数用于显示以相反顺序返回节点。

void ReverseTraverse(TreeNodeCollection nodes, int depth)
{
    if (nodes == null) return;
    foreach (TreeNode child in nodes)
    {
        ReverseTraverse(child.Nodes, depth+1);
        DoSomethingWithNode(child, depth);
    }
}

要调用它,假设MyTreeViewTreeView实例:

ReverseTraverse(MyTreeView.Nodes, 1);

请注意,这不会首先为您提供最深的叶节点,而只是确保在其父节点之前输出任何叶节点。如果您的树看起来像这样:

Node 1
  Node 1.1
  Node 1.2
    Node 1.2.1
Node 2
  Node 2.1
    Node 2.1.1
      Node 2.1.1.1
    Node 2.1.2

输出顺序为:

Node 1.1
Node 1.2.1
Node 1.2
Node 1
Node 2.1.1.1
Node 2.1.1
Node 2.1.2
Node 2.1
Node 2

如果你想要最深的节点(即节点2.1.1.1将首先输出),那么你必须进行完全遍历(以正向顺序最简单)并构建一个节点列表及其对应的节点深处。然后按深度(降序)对列表进行排序并按顺序输出。

答案 1 :(得分:0)

对于二叉树,您正在寻找反向顺序遍历。为此,您可以在顺序遍历期间将节点推送到链接列表(通过右链接节点)。然后你向后看它的链表。

  1. 使用inorder遍历O(n)将二进制搜索树转换为双向链表。
  2. 向后遍历那个双重链表。您可以使用两个指针。
  3. 然后你可以玩得开心并优化它:)

答案 2 :(得分:0)

如果您有BT(二叉树),从树叶到根遍历树的最佳树步行将是后序树步行。这将按以下顺序访问节点:left - >对 - >根。如果您想要撤消此操作,请使用:right - >左 - >根

伪代码:

BottomUpTraversal(x)
    BottomUpTraversal(x.left)
    BottomUpTraversal(x.right)
    print(x.key)