前言
最近一直在学习java SE,也将ACM的平台从九度OJ迁移到了LeetCode OJ,今天是11月的最后一天,在LeetCode OJ上ac了21道题,今天也发一个解题报告
思路
首先,需要明确平衡二叉树的定义,参考:
平衡二叉树
平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。构造与调整方法:平衡二叉树的常用算法有红黑树、AVL、Treap、伸展树等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,1是根节点、F(n-1)是左子树的节点数量、F(n-2)是右子数的节点数量
其次,就是利用二分的思想递归的构造平衡二叉树
(1)找到中点作为根节点 (2)再递归的构建左右子树
AC代码
import java.util.*;
public class ConvertSortArrayToBST {
static class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int x) {
this.val = x;
}
}
public static TreeNode createBST(int[] num, int bt, int ed) {
TreeNode root = null;
if (bt <= ed) {
int mid = bt + (ed - bt) / 2;
root = new TreeNode(num[mid]);
root.left = createBST(num, bt, mid - 1);
root.right = createBST(num, mid + 1, ed);
}
return root;
}
public static TreeNode sortedArrayToBST(int[] num) {
if (num.length == 0) return null;
TreeNode root = createBST(num, 0, num.length - 1);
return root;
}
public static void preOrderTraverse(TreeNode root) {
if (root != null) {
System.out.printf("%d ", root.val);
preOrderTraverse(root.left);
preOrderTraverse(root.right);
}
}
public static void main(String[] args) {
int i, n, num[];
Scanner cin = new Scanner(System.in);
while (cin.hasNext()) {
n = cin.nextInt();
num = new int[n];
for (i = 0; i < n; i++) {
num[i] = cin.nextInt();
}
Arrays.sort(num);
TreeNode root = sortedArrayToBST(num);
preOrderTraverse(root);
System.out.println();
}
cin.close();
}
}