【发布时间】:2010-02-27 00:12:40
【问题描述】:
我正在阅读 Cormen 算法书(二叉搜索树一章),它说有两种方法可以在不递归的情况下遍历树:
使用堆栈和 更复杂但更优雅 不使用堆栈但 假设两个指针可以 相等性测试
我已经实现了第一个选项(使用堆栈),但不知道如何实现后者。 这不是功课,只是读书自学。
关于如何在 C# 中实现第二个的任何线索?
【问题讨论】:
标签: c# algorithm tree binary-tree traversal
我正在阅读 Cormen 算法书(二叉搜索树一章),它说有两种方法可以在不递归的情况下遍历树:
使用堆栈和 更复杂但更优雅 不使用堆栈但 假设两个指针可以 相等性测试
我已经实现了第一个选项(使用堆栈),但不知道如何实现后者。 这不是功课,只是读书自学。
关于如何在 C# 中实现第二个的任何线索?
【问题讨论】:
标签: c# algorithm tree binary-tree traversal
当然。你没有说你想要什么样的遍历,但这里是按顺序遍历的伪代码。
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;
}
}
要获得预购或后购,您需要重新排列块的顺序。
【讨论】:
假设树中的节点是引用,值是引用,你总是可以调用静态的ReferenceEquals method on the Object class来比较,看看任何两个节点/值的引用是否相同。
【讨论】: