C# 比较两个指针是否相等的二进制搜索树遍历

C# 比较两个指针是否相等的二进制搜索树遍历,c#,algorithm,tree,binary-tree,traversal,C#,Algorithm,Tree,Binary Tree,Traversal,我正在读《科曼算法》一书(二元搜索树章节),书中说有两种方法可以不递归地遍历树: 使用堆栈和 更复杂但优雅的 不使用堆栈而只使用 假设可以使用两个指针 平等测试 我已经实现了第一个选项(使用堆栈),但不知道如何实现后者。 这不是家庭作业,只是为了教育自己而读书 关于如何在C#?中实现第二个节点的任何线索假定树中的节点是引用,值是引用,您始终可以调用static进行比较,以查看任意两个节点/值的引用是否相同。当然。你没有说你想要什么样的遍历,但这里是顺序遍历的伪代码 t = tree.Root;

我正在读《科曼算法》一书(二元搜索树章节),书中说有两种方法可以不递归地遍历树:

使用堆栈和 更复杂但优雅的 不使用堆栈而只使用 假设可以使用两个指针 平等测试

我已经实现了第一个选项(使用堆栈),但不知道如何实现后者。 这不是家庭作业,只是为了教育自己而读书


关于如何在C#?

中实现第二个节点的任何线索假定树中的节点是引用,值是引用,您始终可以调用static进行比较,以查看任意两个节点/值的引用是否相同。

当然。你没有说你想要什么样的遍历,但这里是顺序遍历的伪代码

t = tree.Root;
while (true) {
  while (t.Left != t.Right) {
    while (t.Left != null) {   // Block one.
      t = t.Left;
      Visit(t);
    }
    if (t.Right != null) {     // Block two.
      t = t.Right;
      Visit(t);
    }
  }

  while (t != tree.Root && (t.Parent.Right == t || t.Parent.Right == null)) {
    t = t.Parent;
  }
  if (t != tree.Root) {        // Block three.
    t = t.Parent.Right;
    Visit(t);
  } else {
    break;
  }
}

要获得前序或后序,您需要重新排列块的顺序。

这部分我知道,但我不知道的是其余部分,即“遍历”部分,您开始时有一段时间(对),但我看不到任何地方有中断?@reinier:哇!抢手货如果你在最后一步中没有找到根源,你就需要突破。修正了。仍然对算法印象深刻。特别是如果你在头顶上这样做的话+1嗯,也许应该有人测试一下,以确保它是正确的。;)