通过Java方法递归生成完整二叉树

时间:2014-10-29 18:42:17

标签: java recursion binary-tree

该方法应该接受两个参数,一个用于深度,一个用于树的根的整数值。例如:对于任何给定的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;
    }

1 个答案:

答案 0 :(得分: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. 为根
  4. 右侧子树将以root + 2^(n-1)
  5. 为根

    因此,重述应该是:

    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.