• 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;
        }

      

  • 相关阅读:
    必须了解的经典排序算法整理
    浅谈Code Review
    NOIP2018提高组省一冲奖班模测训练(六)
    NOIP2018提高组省一冲奖班模测训练(五)
    NOIP2018提高组金牌训练营——动态规划专题
    poj 3074
    搜索中的剪枝
    bitset骚操作
    NOIP 2017 宝藏
    prim求最小生成树
  • 原文地址:https://www.cnblogs.com/skillking/p/9734446.html
Copyright © 2020-2023  润新知