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