预排序基于数组的二叉搜索树
Posted
技术标签:
【中文标题】预排序基于数组的二叉搜索树【英文标题】:preorder an array based binary search tree 【发布时间】:2009-12-01 05:46:20 【问题描述】:我正在尝试预订 BST 我不知道该怎么做。
【问题讨论】:
【参考方案1】:您应该考虑使用递归方法而不是迭代方法。使用递归很容易完成树遍历(前序、中序和后序)。
The Wikipedia article on tree traversal 有一个伪代码递归算法,但它真的不多。由于您将树存储在数组中,因此您不会有节点指针,只有索引。
至于你如何知道何时到达叶节点,嗯,它们的索引将超出数组的末尾。
【讨论】:
是的,我以前看过。要按前序遍历非空二叉树,从根节点开始,在每个节点上递归执行以下操作: 1. 访问根节点。 2. 遍历左子树。 3. 遍历右子树。我怎么知道我何时完成了遍历数组中的左侧?我需要一个更好的算法。这应该不难。 =( 索引超出了数组的末尾。您可以在递归函数中传递数组的大小以及当前根的索引。【参考方案2】:进行树遍历通常使用递归函数来完成,因为这是表达遍历的最自然的方式。
进行预购遍历非常简单。忽略细节,你有这样的事情:
void do_preorder(Tree t)
// do something with the current tree node
if (leftnode(t) not empty)
do_preorder(leftnode(t));
if (rightnode(t) not empty)
do_preorder(rightnode(t))
如果您想变得棘手,您甚至可以创建一个通用遍历,允许您在运行时选择风味(预购、中购或后购):
void do_xorder(Tree t, Flavor f)
if (f == PREORDER)
handle_currentnode(t)
if (leftnode(t) not empty)
do_xorder(leftnode(t), f);
if (f == INORDER)
handle_currentnode(t)
if (rightnode(t) not empty)
do_xorder(rightnode(t), f)
if (f == POSTORDER)
handle_currentnode(t)
【讨论】:
如果你绝对不能改变这个函数,那么是的,你需要一个辅助函数。如果问题是您无法更改现有调用,您可以给父级一个默认值 (BST::displayPreOrder(ostream &out, int parent = 0))。 @R Samuel:如果您添加的重载仅在一个本身具有默认值的参数上有所不同,则所有对具有单个参数的函数方法的调用都将变得模棱两可:编译器无法确定哪个重载打电话。 @dribeas - 我的建议不是添加新功能,而是更改现有功能。【参考方案3】:根据您的代码,您可以将 (2i + 1) 用于左孩子,将 (2i + 2) 用于右孩子。
我的建议是您应该从数组中的索引 1 开始存储元素,因为您可以将左孩子存储在 (2 * i) 索引处,将右孩子存储在 (2*i + 1) 索引处。
通过检查 (2*i > currSize) 是否为真,可以很容易地找到左孩子的结尾。
http://en.wikipedia.org/wiki/Tree_traversal
查看此链接以了解您想在树上执行的任何遍历...
【讨论】:
以上是关于预排序基于数组的二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章