通过Java方法递归生成完整的二叉树
该方法应该包含两个参数,一个用于深度,另一个用于树根的整数值。例如:对于任何给定的N,返回深度为N的完整二叉搜索树的根引用,以便节点存储整数1、2、…、2n+1–1。我正在努力把这件事做好。以下是我所拥有的:通过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
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