没有什么比这更好的圣诞节假期,所以我决定尝试制作一个二叉搜索树。我坚持使用打印功能。它背后的逻辑应该如何运作?由于树已经按照有点排序的顺序插入它,我想将树从最小值打印到最大值。
所以我需要前往树的最左边分支来打印第一个值。是的,所以在那之后我怎么记得备份的方式,我需要保存上一个节点吗?在维基百科中搜索给了我一个他们使用堆栈的解决方案。和其他解决方案我不太明白他们是如何做到的,所以我在这里问,而不是希望有人能让我高兴。
我也想知道我的插入功能是否正常。我已经看到其他人的解决方案更小了。
void treenode::insert(int i)
{
if(root == 0)
{
cout << "root" << endl;
root = new node(i,root);
}
else
{
node* travel = root;
node* prev;
while(travel)
{
if(travel->value > i)
{
cout << "travel left" << endl;
prev = travel;
travel = travel->left;
}
else
{
cout << "travel right" << endl;
prev = travel;
travel = travel->right;
}
}
//insert
if(prev->value > i)
{
cout << "left" << endl;
prev->left = new node(i);
}
else
{
cout << "right" << endl;
prev->right = new node(i);
}
}
}
void treenode::print()
{
node* travel = root;
while(travel)
{
cout << travel->value << endl;
travel = travel->left;
}
}
答案 0 :(得分:1)
您可以使用递归(伪代码):
prin-tree(node):
print-tree(left-subnode) if exists
print(node-value)
print-tree(right-subnode) if exists
...
print(root-of-tree)
答案 1 :(得分:0)
传统的CS101遍历二叉树以执行任何操作(打印,搜索,插入等)的方法是使用递归。让(无论)例程检查其当前节点,然后如果它不是它正在查找的节点,则使用左侧和/或右侧子树(如果有的话)调用自身。
有关psedocode的详细讨论,请查看the Wikipedia article on tree traversal。它甚至会显示如何没有递归,这与你插入的方式相符。
答案 2 :(得分:0)
这一切都取决于树的定义。如果节点不包含指向父节点的指针,则需要使用堆栈来打印有序的横向节点。最简单的方法是编写一个递归函数来使用应用程序的堆栈。该算法之前已经显示过,但基本上是:
in-order(node):
in-order(node.left) if node.left not null
process(node)
in-order(node.right) if node.right not null
如果节点将指针保存回父节点,那么你可以写一个迭代版本,但它可能不值得努力(除了可以考虑的任何东西)