108. Convert Sorted Array to Binary Search Tree

一、题目

  1、审题

 

  2、分析

   给出一个有序的不重复的整形数组,组成一个二路平衡二叉树(左右子树高度差不超过1)。

二、解答

  1、思路:

    方法一、

      采用递归的方式。(像二分查找)

      ①、为了保持平衡,查找数组的下标中间的数 nums[mid],作为 root;

      ②、(0, mid - 1) 作为 root 的左子树,(mid+1, end) 作为root 的右子树;

      ③、重复 ①、②操作。

public TreeNode sortedArrayToBST(int[] nums) {
        return helperSortedArrayToBST(nums, 0, nums.length - 1);
    }
    
    private TreeNode helperSortedArrayToBST(int[] nums, int start, int end) {
        
        if(start > end)
            return null;
        
        int median = (start + end) / 2;
        TreeNode root = new TreeNode(nums[median]);
        
        root.left = helperSortedArrayToBST(nums, start, median - 1);
        root.right = helperSortedArrayToBST(nums, median + 1, end);
        return root;
    }

  方法二、

    采用循环迭代方式。

    ①、采用一个队列存储临时节点 node,一个队列存储数组此时的开始(start)、结束(end)下标。

    ② 若 start <= end,则 node 节点值 为 nums[(start + end)/2];

public TreeNode sortedArrayToBST(int[] nums) {
        
        int len = nums.length;
        if ( len == 0 ) { return null; }
        // 0 as a placeholder
        TreeNode head = new TreeNode(0); 
        Queue<TreeNode> nodeStack = new LinkedList<>();
        nodeStack.add(head);
        Queue<Integer> indexStack = new LinkedList<>();
        indexStack.add(0);
        indexStack.add(len-1);
        while(!nodeStack.isEmpty()) {
            TreeNode currNode = nodeStack.poll();
            int left = indexStack.poll();
            int right = indexStack.poll();
            int mid = (left + right) / 2;
            currNode.val = nums[mid];
            
            if(left <= mid - 1) {
                currNode.left = new TreeNode(0);
                nodeStack.add(currNode.left);
                indexStack.add(left);
                indexStack.add(mid - 1);
            }
            
            if(right >= mid + 1) {
                currNode.right = new TreeNode(0);
                nodeStack.add(currNode.right);
                indexStack.add(mid+1);
                indexStack.add(right);
            }
        }
        return head;
    }

  

原文地址:https://www.cnblogs.com/skillking/p/9734446.html