【问题标题】:Binary search tree traversal that compares two pointers for equality比较两个指针是否相等的二叉搜索树遍历
【发布时间】:2010-02-27 00:12:40
【问题描述】:

我正在阅读 Cormen 算法书(二叉搜索树一章),它说有两种方法可以在不递归的情况下遍历树:

使用堆栈和 更复杂但更优雅 不使用堆栈但 假设两个指针可以 相等性测试

我已经实现了第一个选项(使用堆栈),但不知道如何实现后者。 这不是功课,只是读书自学。

关于如何在 C# 中实现第二个的任何线索?

【问题讨论】:

    标签: c# algorithm tree binary-tree traversal


    【解决方案1】:

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

    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
    • 好吧,也许应该有人测试一下以确保它是正确的。 ;)
    • 当二叉树只有一个节点时,我们的伪代码不能访问根节点,这不是先序遍历吗?
    【解决方案2】:

    假设树中的节点是引用,值是引用,你总是可以调用静态的ReferenceEquals method on the Object class来比较,看看任何两个节点/值的引用是否相同。

    【讨论】:

    • 这部分我知道,剩下的我不知道,'遍历'部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2011-09-08
    • 1970-01-01
    相关资源
    最近更新 更多