【问题标题】:Insert sorted array into binary search tree将排序后的数组插入二叉搜索树
【发布时间】:2013-10-16 09:29:28
【问题描述】:

我想实现一种算法,将排序后的数组插入到二叉搜索树中,但我不想最终得到一棵只长到一侧的树。

你有什么想法吗?

谢谢。

【问题讨论】:

    标签: algorithm sorting tree binary-tree binary-search-tree


    【解决方案1】:

    这应该会给你一个平衡的树(在 O(n) 中):

    1. 为数组中的中间元素构造一个节点并返回它
      (这将是基本情况下的根)。
    2. 在数组的左半部分从 1. 开始重复,将返回值分配给根的左子节点。
    3. 在数组的右半部分从 1. 开始重复,将返回值分配给根的右孩子。

    类 Java 代码:

    TreeNode sortedArrayToBST(int arr[], int start, int end) {
      if (start > end) return null;
      // same as (start+end)/2, avoids overflow.
      int mid = start + (end - start) / 2;
      TreeNode node = new TreeNode(arr[mid]);
      node.left = sortedArrayToBST(arr, start, mid-1);
      node.right = sortedArrayToBST(arr, mid+1, end);
      return node;
    }
    
    TreeNode sortedArrayToBST(int arr[]) {
      return sortedArrayToBST(arr, 0, arr.length-1);
    }
    

    代码源自here

    【讨论】:

    • 先生,如果没有平衡二叉搜索树的限制,时间复杂度是多少?应该是O(n)吗?
    • 我的意思是可以通过给定的排序输入生成倾斜树。它的时间复杂度是多少?
    • @laura 它也需要 O(n) 来构建一个不平衡的树。简单地遍历输入数组一次需要 O(n),所以没有比这更好的方法了。
    • 先生,还有一个请求。能否请您提供给定算法的递归关系。我想推导出最坏情况的时间复杂度:)
    • @laura 好像是T(n) = 2T(n/2) + 1
    【解决方案2】:
    public class SortedArrayToBST {
        public TreeNode sortedArrayToBST(int[] num) {
            if (num == null) {
                return null;
            }
            return buildBST(num, 0, num.length - 1);
        }
    
        private TreeNode buildBST(int[] num, int start, int end) {
            if (start > end) {
                return null;
            }
            int mid = start + (end - start) / 2;
            TreeNode root = new TreeNode(num[mid]);
            TreeNode left = buildBST(num, start, mid - 1);
            TreeNode right = buildBST(num, mid + 1, end);
            root.left = left;
            root.right = right;
            return root;
        }
    }
    

    【讨论】:

      【解决方案3】:

      以伪随机顺序插入它们,如下所示:

      #include <stdio.h>
      
      int array[] = {1,2,3,4,5,6,7,8,9,10};
      
      #define COUNT 10
      #define STEP 7  /* must be relatively prime wrt COUNT */
      #define START 5 /* not important */
      
      int main(void)
      {
      unsigned idx;
      
      idx=START;
      while(1) {
              printf("[%u] = %u\n", idx, array[idx] );
              // do_insert(array[idx] );
              idx = (idx + STEP ) % COUNT;
              if (idx == START) break;
              }
      return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-30
        • 1970-01-01
        相关资源
        最近更新 更多