将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
思路:为了生成高度平衡的二叉搜索树,则要使左子树和右子树尽量平衡,节点数尽量相近,在有序数组中可以使数组中间的值作为根节点,既下表为index = (0+length)/2的值,index左边的为左子树节点,右边的为右子树的节点,以相同方法找出左子树和右子树的根节点。
public class Code29 {
public static void main(String[] args) {
//给定有序数组
int[] nums = {0,1,2,3,4,5};
//调用方法生成二叉搜索树
TreeNode node = createChildNode(nums, 0, nums.length - 1);
//层序遍历打印
layerOrderErgodic(node);
}
//递归进行生成节点
public static TreeNode createChildNode(int[] nums, int left, int right) {
if (left > right) {
return null;
}
// 总是选择中间位置左边的数字作为根节点
int index = (left + right) / 2;
TreeNode root = new TreeNode(nums[index]);
root.left = createChildNode(nums, left, index - 1);
root.right = createChildNode(nums, index + 1, right);
return root;
}
//层序遍历
public static void layerOrderErgodic(TreeNode node){
if(node == null){
return;
}
LinkedList<TreeNode> list = new LinkedList<TreeNode>();
list.add(node);
TreeNode temp = null;
while(!list.isEmpty()){
temp = list.poll();
System.out.print(temp.val+"->");
if(temp.left != null){
list.add(temp.left);
}
if(temp.right != null){
list.add(temp.right);
}
}
}
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
this.val = x;
}
}
}