Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Java方法递归生成完整的二叉树_Java_Recursion_Binary Tree - Fatal编程技术网

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

通过Java方法递归生成完整的二叉树,java,recursion,binary-tree,Java,Recursion,Binary Tree,该方法应该包含两个参数,一个用于深度,另一个用于树根的整数值。例如:对于任何给定的N,返回深度为N的完整二叉搜索树的根引用,以便节点存储整数1、2、…、2n+1–1。我正在努力把这件事做好。以下是我所拥有的: public static BinaryNode BSTFactory(int top,int depth) { BinaryNode root=new BinaryNode(null,null,top); BinaryNode leftChild,righ

该方法应该包含两个参数,一个用于深度,另一个用于树根的整数值。例如:对于任何给定的N,返回深度为N的完整二叉搜索树的根引用,以便节点存储整数1、2、…、2n+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;
    }

首先,方法的两个参数相互依赖。例如,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的完整二叉搜索树:

  • 根目录应该是
    2^n
  • 左子树将在
    根-2^(n-1)
  • 右子树将在
    root+2^(n-1)
  • 因此,复发应为:

    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和depth调用该方法,以便root=2^depth。为了确保这一点,让我们定义一个包装器方法:

    public static BinaryNode BSTFactory(int depth) 
    {
        return BSTFactory (Math.pow(2^depth),depth);
    }
    
    如果使用任意根和深度调用双参数方法,则可以获得二叉树,如:

    工厂(6,1)

    工厂(1,2)


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

    会发生什么?你期望什么?该方法适用于深度为0和1的两种基本情况,但不适用于任何更大的情况。我一定是把递归搞乱了,但我似乎不知道它是什么。你知道如何使用调试器吗?你只需一步一步地完成代码,然后观察发生了什么。我现在已经开始工作了,谢谢。
         6
       5   7
    
           1
        -1    3
      -2  0  2  4