我想把一个排序的整数数组转换成一个二叉搜索树。我相信我知道该怎么做。我已经在下面发布了我的伪代码。我无法想象的是递归实际上是如何工作的。
如果我的数组是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,结束)。
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);
}
}
}
通用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))))
尽管这实际上取决于你想如何处理不均匀的叶子。
在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。 我输入五个元素,将它们传递给一个数组,对数组进行排序并使用方法。 它会产生这个错误: 如何修复此错误?
我想输出给定值数组的二叉搜索树。它遵循二叉搜索树原理。图表向左旋转 这是所需的输出: 我该怎么修