我正在尝试预订BST 我不知道该怎么做。
答案 0 :(得分:1)
您应该考虑递归方法而不是迭代方法。使用递归非常容易地完成树遍历(预订,顺序和后序)。
The Wikipedia article on tree traversal有一个伪码递归算法,但实际上并没有多少。由于您将树存储在数组中,因此您将不会拥有节点指针,只需要索引。
至于你何时知道何时到达叶节点,它们的索引将超出数组的末尾。
答案 1 :(得分:1)
执行树遍历通常使用递归函数来完成,因为这是表达遍历的最自然方式。
进行预订遍历非常简单。忽略细节,你有这样的事情:
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)
}
答案 2 :(得分:0)
根据您的代码,您可以使用(2i + 1)表示左侧,(2i + 2)表示右侧孩子。
我的建议是你应该开始在数组中存储索引1中的元素,因为你可以将左子存储在(2 * i)索引而将右子存储在(2 * i + 1)索引。
通过检查(2 * i> currSize)是否为真,可以很容易地找到左孩子的结尾。
http://en.wikipedia.org/wiki/Tree_traversal
查看此链接,了解您要在树上执行的任何遍历...