使用递归解决二叉树/二叉搜索树问题的技巧(Java)

时间:2014-08-18 16:21:54

标签: algorithm recursion tree binary-tree binary-search-tree

我正在审查如何使用递归解决Java中的二叉树/二进制搜索树问题,我觉得我有点挣扎。例如:操纵/更改树中的节点,计算某些模式(偶数的数量,树的高度)等等。我几乎总是使用私有帮助器方法。

我想听听一些经验法则,让我的生活更容易解决这些问题。提前谢谢!

编辑:更具体....我只是在谈论涉及使用递归来解决二叉树/ BST问题的任何问题。我不是在谈论任何一个问题。在创建解决方法时,我想知道解决这些问题的策略。就像在解决它们时总是包含或想到某些事物一样。我不能比这更具体。谢谢你的选票。

1 个答案:

答案 0 :(得分:1)

首先,请记住您正在使用BST,而不是未分类的二叉树或非二进制通用树。这意味着在任何时候你都可以依赖于BST不变量:左子树中的每个值<这个<右子树中的每个值。 (在某些实现中包含在一方的相等)。 这是相关的示例:在BST搜索中,如果您要查找的值小于此值,则无法在正确的子树中查找它;它不存在。

除此之外,请像处理任何递归问题一样对待它。这意味着,对于给定的问题:

1)确定哪些案例是微不足道的,不需要递归。编写能够正确识别这些情况的代码并返回简单的结果。一些可能性包括height-0树或没有树(null root)。

2)对于所有其他情况,确定以下哪个更有意义:(两者通常都可以,但一个可以更清洁)

  1. 你可以做什么非递归工作,然后将问题减少到子问题并返回该解决方案(最后的递归,可能是尾递归)
  2. 为解决此问题,您需要先执行哪些递归工作。 (开始时的递归,而不是尾递归)
  3. 拥有私人助手方法并不一定是件坏事;只要它们具有独特而有用的功能,你就不应该为编写它们而感觉不好。当分成3-4种方法而不是将它们塞进一种方法时,肯定会有一些更简洁,更少冗余的递归问题。

    在您坐下来编写代码之前,先了解一些BST问题并查看是否可以识别解决方案的一般结构。希望这可以帮助!如果你特别询问有关Java的BST内容,你可能还想在你的问题上有一个java标记。