该方法应该接受两个参数,一个用于深度,一个用于树的根的整数值。例如:对于任何给定的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;
}
答案 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的完整二叉搜索树:
2^n
root - 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和深度调用方法,使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.