【问题标题】:Convert sorted array to binary search tree with minimal height将排序数组转换为具有最小高度的二叉搜索树
【发布时间】:2016-08-04 19:50:29
【问题描述】:

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

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

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

}

【问题讨论】:

  • 检查我修改后的答案,因为我认为问题在于你的递归逻辑

标签: java recursion binary-search-tree


【解决方案1】:

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

添加 4

   4

添加 1

   4
  / 
 1

添加 3

   4
  /
 3

此时,我们可以查明错误。为什么 4 的左孩子被 3 替换?让我们看看你的insert 方法,其中root 是值为4 的节点,val 是3。

  • 第一个 if 语句条件的计算结果为 false,所以继续
  • 第二个 if 语句条件的计算结果为真,因此使用 val 创建一个新节点并将 root.left 设置为等于这个新节点
  • 第三个 if 语句条件的计算结果为 false,所以继续
  • 递归调用insert(3.left, 3) 刚刚返回,因为3 == 3
  • 递归调用insert(null, 3) 刚刚返回,因为root == null

那么解决方法是什么? STOP 在调用堆栈中的每次递归调用时创建新节点。信不信由你,你应该只在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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-28
    • 2018-11-05
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2013-04-17
    • 2016-07-12
    • 2011-06-25
    相关资源
    最近更新 更多