一、题目
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; }