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

将排序数组转换为二进制搜索树(描绘递归)

严峰
2023-03-14

我想把一个排序的整数数组转换成一个二叉搜索树。我相信我知道该怎么做。我已经在下面发布了我的伪代码。我无法想象的是递归实际上是如何工作的。

如果我的数组是1,2,3,4,5。。。我首先将3作为我的BST的根,然后将2作为3的左子节点。那么我要把1设为2的左子节点,然后返回到2吗?我不明白递归是如何贯穿整个过程的。。。

提前感谢,如果这个问题解释得不好,请道歉。我不想要显式的代码,但如果有人能帮我解释一下递归是如何通过问题运行的(即以什么顺序访问哪些节点/调用堆栈是如何工作的),我将非常感激

伪代码:

步骤1.创建一个包含整数数组、整数开始和整数结束的函数。Start=0,end=整数数组大小-1。

步骤2.创建一个等于(开始结束)/2的整数中间。

第三步。测试是否启动

第四步。如果是,则返回null。

第5步。否则,将中间索引处的值设置为树的根。

第六步。将根的左节点设置为与(array,start,middle-1)相同的函数。

第七步。将根的右节点设置为函数(数组,中间1,结束)。

共有3个答案

笪煌
2023-03-14
public class ArrayToBst {

    private static int[] arr = { 1, 2, 3, 4, 5, 6, 7 };

    public static void main(String[] args) {

        Node talakorootpreservegareko = getBst(arr, 0, 6); 
        inOrder(talakorootpreservegareko);

    }

    public static Node getBst(int[] arr, int start, int stop) {
        if (start > stop) {
            return null;
        } else {
            int mid = (start + stop) / 2;
            Node root = new Node(arr[mid]); 
            System.out.println(root.data);
            root.left = getBst(arr, start, mid - 1);
            root.right = getBst(arr, mid + 1, stop);
            // System.out.print(root.data + " \t");
            return root;
        }
    }

    public static void inOrder(Node parent) {
        if (parent != null) {
            inOrder(parent.left);
            System.out.print(" data " + parent.data + "\t");
            inOrder(parent.right);
        }
    }
}
许俊雅
2023-03-14

通用Lisp版本:

(defun sorted-array->tree (array)
  (loop
     :with olength := (length array)
     :with length := (ceiling olength 2)
     :with result := (make-array length)
     :for i :from 0 :below length
     :for j :from 0 :by 2
     :for k :from 1 :by 2 :do
     (setf (aref result i)
           (if (< k olength)
               (list (aref array j) (aref array k))
               (list (aref array j))))
     :finally
     (return (if (= 1 length)
                 (aref result 0)
                 (sorted-array->tree result)))))

(sorted-array->tree #(1 2 3 4 5 6 7 8 9))

;; ((((1 2) (3 4)) ((5 6) (7 8))) (((9))))

尽管这实际上取决于你想如何处理不均匀的叶子。

松嘉运
2023-03-14

在Java中:

public static BST sortedArrayToBST(int[] arr){
    BST bst = new BST();
    sortedArrayToBST(arr, 0, arr.length-1, bst);
    return bst;
}

private static void sortedArrayToBST(int[] arr, int start, int end, BST bst) {

    if( start == end){
        bst.insert(new Node(arr[start]));
        return;
    }
    else if(start > end) {
        return;
    }
    int middle = (start+end)/2;
    bst.insert(new Node(arr[middle]));
    sortedArrayToBST(arr, start, middle - 1, bst);
    sortedArrayToBST(arr, middle+1, end, bst);
}

测试:

    int[] arr = {1,2,3,4,5,6,7,8,9};
    BST bst = sortedArrayToBST(arr);
    bst.printInOrder();

输出

1,2,3,4,5,6,7,8,9,

 类似资料:
  • 我正在研究“将排序数组转换为具有最小高度的二叉搜索树”,它问: 给定一个排序(递增顺序)数组,将其转换为最小高度的二叉树。 我无法找到为什么我的递归没有像我预期的那样停止。当7通过时,它应该停止,并且不会再次打印出7。我还发现了一个类似的答案,看起来使用了和我相同的策略,但效果很好。(我不认为我的问题与上面列出的问题重复,但我仍然想感谢您为我链接这些问题。他们给了我更多解决问题的想法。) 我的代码

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

  • 在我的解决方案中,我遇到了一个“None's not have.val”的问题。。。我想知道如何调试它。。。 以下是描述 将BST转换为已排序的循环双链接列表。将左指针和右指针视为双链接列表中上一个和下一个指针的同义词。] 让我们以下面的BST为例,它可能会帮助您更好地理解这个问题:我们希望将这个BST转换为一个循环双链接列表。双链表中的每个节点都有一个前导节点和后继节点。对于循环双链表,第一个元

  • 一个痛苦而愚蠢的问题,我几乎羞于不敢问。在过去的4个小时里,我一直在寻找,测试了不同的算法,在纸上尝试了不少,但仍然无法正常工作。 我将为您提供项目实现的详细信息,但基本问题是:“如何处理在预排序二叉树中插入节点。 通过预排序BST,我的意思是所有节点都应该以这样的方式插入,即使用预排序遍历(例如用于打印)遍历树时,应该按升序打印节点。 我只需要一个简单的算法。我尝试了这里给出的一个简单的插入算法

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

  • 我想输出给定值数组的二叉搜索树。它遵循二叉搜索树原理。图表向左旋转 这是所需的输出: 我该怎么修