C ++打印出二叉搜索树

时间:2010-12-27 22:41:37

标签: c++ binary-tree traversal

没有什么比这更好的圣诞节假期,所以我决定尝试制作一个二叉搜索树。我坚持使用打印功能。它背后的逻辑应该如何运作?由于树已经按照有点排序的顺序插入它,我想将树从最小值打印到最大值。

所以我需要前往树的最左边分支来打印第一个值。是的,所以在那之后我怎么记得备份的方式,我需要保存上一个节点吗?在维基百科中搜索给了我一个他们使用堆栈的解决方案。和其他解决方案我不太明白他们是如何做到的,所以我在这里问,而不是希望有人能让我高兴。

我也想知道我的插入功能是否正常。我已经看到其他人的解决方案更小了。

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;
   }

}

3 个答案:

答案 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

如果节点将指针保存回父节点,那么你可以写一个迭代版本,但它可能不值得努力(除了可以考虑的任何东西)