题目
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
解答
解法一:递归
递归比较好理解。
步骤如下:
- 取区间的中点作为根节点。
- 构造左子树 。
- 构造右子树。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return sortedArrayToBST(nums, 0, nums.length - 1);
}
private TreeNode sortedArrayToBST(int[] nums, int start, int end) {
if(start > end) return null;
int mid = (start + end) >>> 1;
TreeNode node = new TreeNode(nums[mid]);
node.left = sortedArrayToBST(nums, start, mid - 1);
node.right = sortedArrayToBST(nums, mid + 1, end);
return node;
}
}
结果
解法二:队列 + BFS
Entry 类解释:
- root 表示:区间 [start, end] 生成的树的根节点。
- start 表示:区间左边界。
- end 表示:区间有边界。
流程如下:
- 通过层序的方式。每一个结点赋值过后会创建左右子树的根节点并建立好联系。
- 然后将其左右子树的根节点与其相对应的区间范围封装成一个 Entry 放入队列。
- 不断从队列中取出 Entry 处理。
通过这种方式可以在创建结点时,顺便赋值了。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
class Entry {
TreeNode root;
int start;
int end;
Entry(TreeNode root, int start, int end) {
this.root = root;
this.start = start;
this.end = end;
}
}
public TreeNode sortedArrayToBST(int[] nums) {
if(nums == null || nums.length == 0) return null;
LinkedList<Entry> queue = new LinkedList<>();
Entry rootEntry = new Entry(new TreeNode(0), 0, nums.length - 1);
queue.offer(rootEntry);
while(!queue.isEmpty()) {
Entry entry = queue.poll();
int start = entry.start;
int end = entry.end;
int mid = (start + end) >>> 1;
TreeNode curRoot = entry.root;
curRoot.val = nums[mid];
if(start <= mid - 1) {
curRoot.left = new TreeNode(0);
queue.offer(new Entry(curRoot.left, start, mid - 1));
}
if(mid + 1 <= end) {
curRoot.right = new TreeNode(0);
queue.offer(new Entry(curRoot.right, mid + 1, end));
}
}
return rootEntry.root;
}
}