当前位置: 首页 > 知识库问答 >
问题:

将排序数组转换为二叉搜索树[duplicate]

裴兴言
2023-03-14

我正在研究“将排序数组转换为具有最小高度的二叉搜索树”,它问:

给定一个排序(递增顺序)数组,将其转换为最小高度的二叉树。

我无法找到为什么我的递归没有像我预期的那样停止。当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;
}

共有2个答案

锺离锦
2023-03-14

这可能有用

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;
}
敖硕
2023-03-14

让我们使用以下数组:

[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,所以n

在第i层,从i=0开始,我们得到了:

n/2^(i1)、3*n/2^(i1)、5*n/2^(i1)

上面的数字都是数组中的索引。

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]);
    }
}

 类似资料:
  • 这是一个程序,用于将元素按升序排序的数组转换为高度平衡的BST。 我输入五个元素,将它们传递给一个数组,对数组进行排序并使用方法。 它会产生这个错误: 如何修复此错误?

  • 我想把一个排序的整数数组转换成一个二叉搜索树。我相信我知道该怎么做。我已经在下面发布了我的伪代码。我无法想象的是递归实际上是如何工作的。 如果我的数组是1,2,3,4,5。。。我首先将3作为我的BST的根,然后将2作为3的左子节点。那么我要把1设为2的左子节点,然后返回到2吗?我不明白递归是如何贯穿整个过程的。。。 提前感谢,如果这个问题解释得不好,请道歉。我不想要显式的代码,但如果有人能帮我解释

  • HLOJ 9576,习题7-2 二叉排序树 输入一个整数关键字序列,生成一棵用链式存储结构存储的二叉排序树,对该二叉排序树能进行查找和插入结点的操作,并对该二叉排序树中结点的关键字按递增和递减顺序输出。 要求依次完成以下工作: (1) 以这n个整数生成(建立)一棵用链式存储结构存储的二叉排序树; (2) 按递增顺序输出该二叉排序树中的整数(关键字); (3) 输入一个整数key1,对该二叉排序树进

  • 我希望将二叉树表示为数组,以便数组在数组中表示为空的广度一阶。我不想使用数组列表,但很乐意使用链表结构。我发现数组的最大大小的大小将是2^n-1,其中n是以下情况下树的高度: 数组的最小大小(除了空树或没有子项的根 [大小为 0 和 3 相应])为 (2^n - 1) - 6,在这种情况下,6 可以计算为前一个级别的空位数乘以 2: 这些树是否可以表示为堆,其中位于索引0并且当前节点在索引i处的左

  • 下面给出了二叉树的实现。 如图中所示,树不是完整的二叉树。如何编写一个函数,将上述二叉树转换为完整的二叉树,只需将字符串数据节点添加到没有子节点的节点,即可生成完整的二叉树。 我将手动在代码中添加节点,以获得如下结果树: 但是,如何编写一个函数,它将采取根节点和返回树,这是完整的二叉树。

  • 我想实现一种将排序数组插入二叉搜索树的算法,但我不希望最终得到一棵只向一侧生长的树。 你有什么想法吗? 谢谢你。