C++ C++;打印出一个二进制搜索树
这个圣诞节我没有更好的事可做,所以我决定尝试制作一个二叉搜索树。我被打印功能卡住了。它背后的逻辑应该如何运作?因为树已经按某种排序顺序插入了它,我想把树从最小值打印到最大值 所以我需要移动到树最左边的分支来打印第一个值。好的,那么在那之后我如何记得备份的方式,我需要保存上一个节点吗?在维基百科上的一次搜索给了我一个他们使用的解决方案。我不太明白他们是怎么做到的,所以我在这里问,希望有人能启发我 我还想知道我的插入功能是否正常。我看到其他人的解决方案变小了C++ C++;打印出一个二进制搜索树,c++,binary-tree,traversal,C++,Binary Tree,Traversal,这个圣诞节我没有更好的事可做,所以我决定尝试制作一个二叉搜索树。我被打印功能卡住了。它背后的逻辑应该如何运作?因为树已经按某种排序顺序插入了它,我想把树从最小值打印到最大值 所以我需要移动到树最左边的分支来打印第一个值。好的,那么在那之后我如何记得备份的方式,我需要保存上一个节点吗?在维基百科上的一次搜索给了我一个他们使用的解决方案。我不太明白他们是怎么做到的,所以我在这里问,希望有人能启发我 我还想知道我的插入功能是否正常。我看到其他人的解决方案变小了 void treenode::inser
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;
}
}
void树节点::插入(int i)
{
如果(根==0)
{
(一)
{
(一)
{
cout您可以使用递归(伪代码):
传统的CS101遍历二叉树执行任何操作(打印、搜索、插入等)的方法是使用递归。让(任意)例程检查其当前节点,然后如果该节点不是它正在查找的节点,则使用左和/或右子树(如果有)调用自己
关于psedocode的精彩讨论,请查看。它甚至显示了如何在不使用递归的情况下执行,而递归将与插入方式相匹配。这一切都取决于树的定义。如果节点不包含返回父节点的指针,则需要使用堆栈以横向顺序打印。最简单的方法是我们需要编写一个递归函数来使用应用程序的堆栈。算法之前已经演示过,但基本上:
in-order(node):
in-order(node.left) if node.left not null
process(node)
in-order(node.right) if node.right not null
如果节点将指针保留回父节点,那么您可以编写一个迭代版本,但这可能不值得付出努力(除了值得思考的东西)有趣的是它能工作。不那么有趣的是我不理解它…我讨厌递归…@starcorn-如果你对递归有这种感觉,我的建议是放弃这个项目,开始用Lisp编写程序一段时间,直到你对它感到满意为止。有时有理由避免它,但要成为一个真正的专家开发人员,还是会重复sion需要在您的工具箱中。@starcorn-因为未初始化的递归可能会让人望而生畏-我们中的大多数人都会经历这种情况!这里有一个简单的方法来理解递归-递归调用的“关键”不在递归本身,而在“最终情况”中,即当您不打算执行递归调用时执行的代码部分。首先尝试了解打印函数-不同版本的postorder、preorder和inorder。快速搜索显示此网页
in-order(node):
in-order(node.left) if node.left not null
process(node)
in-order(node.right) if node.right not null