我想将排序的整数数组转换为二叉搜索树。我在下面发布了我的代码。我无法想象的是递归实际上如何与for循环一起插入。
所以,如果我的数组是[1,3,4,5,8,10],我将4,即数组的中间,成为我的BST的根,然后从数组的开头循环并插入到刚刚创建了root的树。我的问题是为什么插入的结果的顺序不是作为已排序的给定数组?
public TreeNode sortedArrayToBST(int[] A) {
if (A == null || A.length == 0){
return null;
}
TreeNode root = new TreeNode(findMid(A));
for (int i = 0; i < A.length; ++i){
insert(root, A[i]);
}
return root;
}
private int findMid(int[] A){
int left = 0;
int right = A.length -1;
int mid = A[left + (right - left)/2];
return mid;
}
private void insert (TreeNode root, int val){
if (root == null || root.val == val){
return;
}
if (val < root.val){
TreeNode left = new TreeNode(val);
root.left = left;
}
if (val > root.val){
TreeNode right = new TreeNode(val);
root.right = right;
}
insert(root.left,val);
insert(root.right,val);
}
答案 0 :(得分:0)
您的递归insert
方法存在一些问题。首先,每次val
不等于根值时,您都会创建一个新节点。这是错误的,因为通过这样做,您可以创建多个节点并在递归到这些新节点的每一步设置root的子节点,这是多余的。让我们为每个节点完成您的方法。
添加4
4
添加1
4
/
1
添加3
4
/
3
此时,我们可以查明错误。为什么4岁的孩子被3岁的孩子取代?我们来看看insert
方法,其中root
是值为4且val
为3的节点。
val
的新节点,并将root.left设置为等于此新节点insert(3.left, 3)
仅从3 == 3
insert(null, 3)
仅从root == null
那么修复是什么? STOP 在调用堆栈中的每次递归调用时创建新节点。信不信由你,你应该只在root
为空时创建一个新节点,因为这表示你已经将树遍历到一个空子。那些递归调用呢?没有必要对每个root的子进行递归调用,因为你只需要在BST中按一个遍历路径。您可以在每个节点左转或右转。所以你所做的只是根据val
相对于根值的值进行递归调用。这是它应该是什么样子,
private TreeNode insert (TreeNode root, int val){
if (root == null){
return new TreeNode(val);
}
if (val == root.val){
//if you don't want to add repeats in the tree, then
//add your own code to deal with that here
//although as it stands now, this code will not add repeats
}
if (val < root.val){
root.left = insert(root.left, val);
}
if (val > root.val){
root.right = insert(root.right, val);
}
return root;
}