【问题标题】:Generating a Full Binary Tree Recursively through a Java Method通过 Java 方法递归生成完整的二叉树
【发布时间】:2014-10-30 03:54:06
【问题描述】:

该方法应该接受两个参数,一个用于深度,一个用于树根的整数值。例如:对于任何给定的 N,返回深度为 N 的完整二叉搜索树的根引用,以便节点存储整数 1、2、...、2 N+1 – 1。我正在努力做到这一点。这是我所拥有的:

public static BinaryNode BSTFactory(int top,int depth) {
        BinaryNode root=new BinaryNode(null,null,top);
        BinaryNode leftChild,rightChild;
        if(depth==0){
            return root;
        }
        if(depth==1){
            //create 2 children left and right
           leftChild=new BinaryNode(null,null,top-1);
            rightChild=new BinaryNode(null,null,top+1);
           root=new BinaryNode(rightChild,leftChild,top);
            return root;
        }
        if(depth>1){

           leftChild=BSTFactory(top-1,depth-1);
           rightChild=BSTFactory(top+1,depth-1);
           root=new BinaryNode(rightChild,leftChild,top);
            return root;
       }
       return root;
    }

【问题讨论】:

  • 会发生什么?你期待什么?
  • 该方法适用于 2 个基本情况,即深度为 0 和 1,但不适用于更大的情况。我一定是把递归搞砸了,但我似乎无法弄清楚它是什么。
  • 你知道如何使用调试器吗?您只需单步执行代码并观察会发生什么。
  • 我现在可以使用了,谢谢。

标签: java recursion binary-tree


【解决方案1】:

首先,你的方法的两个参数是相互依赖的。例如,BSTFactory(1,3) 不能是最小节点为 1 的完整二叉树,因为如果根已经包含最小节点,则左子树必须为空(除非您在树,您的问题并不清楚,因为您似乎希望树存储从 1) 开始的整数。

因此,我建议使用仅接受深度并计算匹配根节点的包装方法。我们稍后会看到这两个参数是如何关联的。

现在让我们看一些小的完整二叉树来计算递归:

深度 0

   1

深度 1

   2
1     3

深度 2

     4
   2    6
 1  3  5  7

深度 3

          8
     4        12
  2     6   10   14
1   3  5 7 9 11 13 15

我们可以从这些例子中学到什么?

如果我们要创建深度为 n 的完整二叉搜索树:

  1. 根是2^n
  2. 左子树将以root - 2^(n-1)为根
  3. 右子树的根是root + 2^(n-1)

因此,recusion 应该是:

public static BinaryNode BSTFactory(int root, int depth) 
{
    BinaryNode leftChild,rightChild;
    if (depth==0){
        return new BinaryNode(null,null,root);
    } else {
       leftChild=BSTFactory(root-Math.pow(2,depth-1),depth-1);
       rightChild=BSTFactory(root+Math.pow(2,depth-1),depth-1);
       return new BinaryNode(rightChild,leftChild,root);
   }
}

请注意,为了使其工作(即您的最小节点为 1),您必须使用 root 和深度调用该方法,使得 root=2^depth。为了确保这一点,让我们定义一个包装方法:

public static BinaryNode BSTFactory(int depth) 
{
    return BSTFactory (Math.pow(2^depth),depth);
}

如果调用任意根和深度的二参数方法,可以得到二叉树如:

BSTFactory (6,1)

     6
   5   7

BSTFactory (1,2)

       1
    -1    3
  -2  0  2  4

仍然有完整的二叉树,但它们的最小值不是 1。

【讨论】:

    猜你喜欢
    • 2013-07-20
    • 2013-06-05
    • 1970-01-01
    • 2020-02-10
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2016-07-20
    相关资源
    最近更新 更多