我正在研究“将分类数组转换为具有最小高度的二进制搜索树”,其中提出:
给定排序(递增顺序)数组,将其转换为创建具有最小高度的二叉树。
我无法找到为什么我的递归不会像我预期的那样停止。它应该在7通过时停止,并且不会再打印7。我也找到了类似的答案,它看起来像我的使用相同的策略,但它工作正常。 (我不认为我的问题与上面列出的问题重复,但我仍然要感谢你将它们链接起来。他们给了我更多的想法来解决我的问题。)
我的代码如下:
public TreeNode sortedArrayToBST(int[] A) {
int len = A.length;
if(len <= 0){
return null;
}
TreeNode root = new TreeNode(A[(len - 1) / 2]);
if(len == 1){
return root;
}
else{
helper(root, A, 0, len - 1);
}
return root;
}
public void helper(TreeNode root, int[] A, int leftPoint, int rightPoint){
if((rightPoint - leftPoint) <= 0){
return;
}
int mid = (rightPoint - leftPoint) / 2 + leftPoint;
int leftChild = (mid - 1 - leftPoint) / 2 + leftPoint;
int rightChild = (rightPoint - (mid + 1)) / 2 + mid + 1;
TreeNode left = new TreeNode(A[leftChild]);
root.left = left;
TreeNode right = new TreeNode(A[rightChild]);
root.right = right;
helper(root.left, A, leftPoint, mid - 1);
helper(root.right, A, mid + 1, rightPoint);
return;
}
当我运行它时,我得到了它。
我的输入
[1,2,3,4,5,6,7,8]
我的输出
{4,2,6,1,3,5,7,#,#,#,#,#,#,7,8}
预期
{4,2,6,1,3,5,7,#,#,#,#,#,#,#,8}
为什么右侧有7个副本?由于已经使用了7,它应该被踢出去。
我发现我的想法与以下答案类似:
public TreeNode sortedArrayToBST(int[] A) {
// write your code here
int len = A.length;
if(len <= 0){
return null;
}
TreeNode root = helper1(A, 0, len - 1);
return root;
}
public TreeNode helper1(int[] A, int low, int high){
if(low > high){
return null;
}
int mid = (high + low) / 2;
TreeNode root = new TreeNode(A[mid]);
root.left = helper1(A, low, mid - 1);
root.right = helper1(A, mid + 1, high);
return root;
}
答案 0 :(得分:0)
我们有以下数组:
[1,2,3,4,5,6,7]
预期的BST是:
4
2 6
1 3 5 7
为实现这一目标,我们可以采用以下方式:
for (int i = 0; i < logn; i++) {
//insert ith level
}
为了简化操作,我们可以找到min,因此n > array.length
和n = 2^k
。
在第i级,从我们得到的i = 0
开始:
n/2^(i+1), 3*n/2^(i+1), 5*n/2^(i+1)...
上面的数字是数组中的所有索引。
public TreeNode sortedArrayToBST(int[] A) {
int len = A.length;
if(len <= 0){
return null;
}
int n = 1;
int i = 0;
while (n < len) {
n *= 2;
i++;
}
TreeNode root = new TreeNode(A[n/2]);
for (int j = 1; j < i; j++) {
insert(root, j, n, A);
}
}
private void insert(TreeNode root, int j, int n, int[] A) {
int helper = n/Math.pow(2, j+1);
for (int i = 1; i <= Math.pow(2, j); i ++) {
root.add(A[i*helper]);
}
}
答案 1 :(得分:0)
这可能有效
public TreeNode sortedArrayToBST(int[] A) {
if (A.length() == 0)
return null;
return helper1(A, 0, A.length - 1);
}
public TreeNode helper1(int[] A, int low, int high) {
if (low > high)
return null;
// Binary Search
int mid = low + (high - low)/2;
TreeNode root = new TreeNode(A[mid]);
root.left = helper1(A, low, mid - 1);
root.right = helper1(A, mid + 1, high);
return root;
}