1. 问题描述:
Given a sorted(increasing order) array, write an algorithm to create a binary search tree with mininal height;
给出一个上升序列的数组,使用一种算法来构建一颗具有最小高度的树
树节点的定义如下:
public class TreeNode<T> {
public T val;
public TreeNode<T> left = null;
public TreeNode<T> right = null;
public TreeNode<T> parent = null;
public TreeNode(T val) {
this.val = val;
}
@Override
public String toString() {
return "TreeNode [val=" + val + "]";
}
}
下面以中序遍历为例来进行构建,在中序遍历中以谁作为根对于同样的序列那么构建出来的树都是不一样的,所以对应的树的高度也是不一样的,要想使得树的高度最小那么应该使树的两边的节点尽可能分布均匀,那么我们可以采用首尾相加相除的方式来得到当前的根节点(中间节点)是谁,取得中间节点之后之后那么以中间为界限分为了左右两个区间,对于左右两个区间我们又可以使用同样的方式来进行处理,那么这个时候我们可以使用递归的方式来进行解决即可
构建出整棵树之后我们得到了整棵树的根节点,这个时候可以使用中序遍历进行输出,也可以使用前序遍历和后序遍历进行检验来查看构建的树是否正确
代码如下:
public class BSTWithMinHeight {
//左右两边进行递归即可
@SuppressWarnings("unchecked")
public static void main(String[] args) {
int arr[] = {1, 2, 3, 4, 5, 6, 7};
/*int arr[] = {1, 7, 4, 3, 5, 2, 6};*/
TreeNode root = createMinBST(arr, 0, arr.length - 1);
preOrder(root);
System.out.print("\n");
midOrder(root);
System.out.print("\n");
lastOrder(root);
}
//前序遍历
private static void preOrder(TreeNode<Integer> root) {
if(root == null){
return;
}
System.out.print(root.val + " ");
preOrder(root.left);
preOrder(root.right);
}
//中序遍历
private static void midOrder(TreeNode<Integer> root) {
if(root == null){
return;
}
midOrder(root.left);
System.out.print(root.val + " ");
midOrder(root.right);
}
//后序遍历
private static void lastOrder(TreeNode<Integer> root) {
if(root == null){
return;
}
lastOrder(root.left);
lastOrder(root.right);
System.out.print(root.val + " ");
}
private static TreeNode<Integer> createMinBST(int[] arr, int start, int end) {
if(start > end) return null;
int mid = (start + end) >> 1;
TreeNode<Integer> left = createMinBST(arr, start, mid - 1);
TreeNode<Integer> right = createMinBST(arr, mid + 1, end);
TreeNode<Integer> res = new TreeNode<Integer>(arr[mid]);
res.left = left;
res.right = right;
return res;
}
}