将排序数组转换为最小高度为

时间:2016-08-04 19:50:29

标签: java recursion binary-search-tree

我想将排序的整数数组转换为二叉搜索树。我在下面发布了我的代码。我无法想象的是递归实际上如何与for循环一起插入。

所以,如果我的数组是[1,3,4,5,8,10],我将4,即数组的中间,成为我的BST的根,然后从数组的开头循环并插入到刚刚创建了root的树。我的问题是为什么插入的结果的顺序不是作为已排序的给定数组? enter image description here

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

}

1 个答案:

答案 0 :(得分:0)

您的递归insert方法存在一些问题。首先,每次val不等于根值时,您都会创建一个新节点。这是错误的,因为通过这样做,您可以创建多个节点并在递归到这些新节点的每一步设置root的子节点,这是多余的。让我们为每个节点完成您的方法。

添加4

   4

添加1

   4
  / 
 1

添加3

   4
  /
 3

此时,我们可以查明错误。为什么4岁的孩子被3岁的孩子取代?我们来看看insert方法,其中root是值为4且val为3的节点。

  • 首先if语句条件的计算结果为false,所以继续
  • 第二个if语句条件的计算结果为true,因此创建一个val的新节点,并将root.left设置为等于此新节点
  • 第三个if语句条件的计算结果为false,因此继续
  • 递归调用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;
}