在BST中顺序遍历

时间:2012-03-08 07:02:31

标签: c algorithm data-structures binary-tree

如何在递归顺序二进制搜索树遍历中跟踪上一个节点?

...当量 找到任何没有的楼层......在bst ... iam试图在bst中找到大于给定值的第一个数字......并且在那时打印prev节点的数据,该数据等于或小于给定值因为它是遍历遍历......

  

那么为什么我们如何能够跟踪bst中的上一个节点呢?   递归inorder遍历??

2 个答案:

答案 0 :(得分:1)

二叉树递归的工作原理是左下树然后右下。 Inorder / preorder / postorder是仅通过递归过程中的一些本地动作的排序来确定的约定:关于两个递归调用“访问”当前节点本身的定时。

如何获取下一个节点是让递归返回它。

当您递归到树中时,“inorder”中访问的最后一个节点就是最右边的节点!因此,您的递归必须只返回最右边的节点。

此外,如果树T作为整体具有一些先前节点P,则T的左子树,即左(T)也具有相同的前一节点P.P是T的最左边节点的前身< / p>

此外,关于右(T)的前一节点是节点T本身。

因此,当递归到左(T)时,我们可以简单地传递给我们的同一个前任,当递归到右(T)时,我们将自己作为前任传递。

伪代码:

# a recursive function that is given its previous node,
# and returns the rightmost node

recurse_with_previous (tree previous-in):
   # skip empty link. No leaf to see here!
   # previous-in is the rightmost node still
   if null(tree)
      return previous-in

   # if we are at a leaf, then that leaf is rightmost
   if leaf(tree)
      print "visiting leaf node " tree " with previous node " previous-in
      return tree

   # the previous node (previous-in) of this tree is actually the left
   # subtrees previous node, so we just pass that parameter down
   previous = recurse_with_previous (left(tree) previous-in)

   # inorder visit: visit this node between the subtrees
   print "visiting " tree " with previous node " previous

   # now the right subtree. what is ITS previous? Why, we are!!!
   # we return whatever this returns causing the return value
   # to be the rightmost node.
   return recurse_with_previous (right(tree) tree)

 # how to call
 recurse_with_previous(some-tree nil)

答案 1 :(得分:1)

(旁白:听起来好像你要求的是有序遍历,而是一个二进制搜索函数,它返回的最大节点不超过查询。)

在递归算法中跟踪这类内容的两种最常见的方法是将其作为参数传递,或者返回到它。 (无论哪种方式,您都要将有关过去的信息存储在堆栈中。)

在你的情况下,做后者可能是最干净的。例如:

Node* floor_node(int x, Node *subtree) {
  if (subtree) {
    if(subtree->value > x) {
      return floor_node(x, subtree->left);
    } else {
      return floor_node(x, subtree->right) || subtree;
    }
  } else {
      return subtree;
  }
}