我正在研究“将排序数组转换为具有最小高度的二叉搜索树”,它问:
给定一个排序(递增顺序)数组,将其转换为最小高度的二叉树。
我无法找到为什么我的递归没有像我预期的那样停止。当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;
}
这可能有用
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;
}
让我们使用以下数组:
[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处的左
下面给出了二叉树的实现。 如图中所示,树不是完整的二叉树。如何编写一个函数,将上述二叉树转换为完整的二叉树,只需将字符串数据节点添加到没有子节点的节点,即可生成完整的二叉树。 我将手动在代码中添加节点,以获得如下结果树: 但是,如何编写一个函数,它将采取根节点和返回树,这是完整的二叉树。
我想实现一种将排序数组插入二叉搜索树的算法,但我不希望最终得到一棵只向一侧生长的树。 你有什么想法吗? 谢谢你。