将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
通过此题掌握树的知识和递归的运用
题目分析:给定一个数组,是按升序排列的,要将它转化为一棵高度平衡的二叉搜索树(AVL树),我们需要知道 高度平衡二叉搜索树的概念,可以参考这篇博客;
二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:
- 非空左子树的所有键值小于其根结点的键值。
- 非空右子树的所有键值大于其根结点的键值。
- 左、右子树都是二叉搜索树。
平衡二叉树的定义(Balance Binary tree 或者称为AVL树):
- 空树
- 2.任意节点左右子树的高度差不超过1,即|BF|<=1
了解了这些概念之后,对于此题,我们采用二分法,每次对数组二分取中点值作为树的根结点,这样就能保证根结点的左子树节点都比根结点小,根结点的右子树节点都比根结点大;然后我们运用递归的思想,对根结点的左子树和右子树递归即可。
代码实现:
public static class TreeNode { int data; TreeNode left; TreeNode right; TreeNode(int val) { data = val; } } public TreeNode sortedArrayToBST(int[] nums) { if (nums.length == 0) return null; else return buildBST(nums,0,nums.length - 1); } private TreeNode buildBST(int[] nums, int start, int end) { if (start <= end) { int mid = (start + end) / 2; TreeNode root = new TreeNode(nums[mid]); root.left = buildBST(nums, start, mid - 1); root.right = buildBST(nums, mid + 1, end); return root; } else return null; }
主函数:
//中序遍历验证结果 public static void midPrint(TreeNode p) { if (p != null) { midPrint(p.left); System.out.print(p.data + " "); midPrint(p.right); } } public static void main(String[] args) { Tree3 t = new Tree3(); int[] a = new int[]{1,2,3,4,5}; TreeNode p = t.sortedArrayToBST(a); midPrint(p); }
我们采用中序遍历来验证算法结果是否正确;注意:中序遍历的结果与给出的有序数组是一样的。
运行结果:
**1 2 3 4 5 **