一、描述:
二、思路:
二叉查找树(Binary Search Tree):(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树(来自百度百科);
平衡二叉树(Balanced Binary Tree):它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树;
要保证是二叉搜索树,只需要在插入结点的时候从根结点开始一一比较,若小于当前结点,则搜索其左子树;若大于等于,则搜索其右子树,依次循环;
根据平衡二叉树的一性质:若为平衡二叉树,则中序遍历结果为一非递减序列。故可以试探性地在有序数组中每次以处于中间的元素作为二叉树根结点,原理为二分法,递归实现;
三、代码:
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 11 public class Solution { 12 TreeNode root = null; 13 14 public TreeNode sortedArrayToBST(int[] nums) { 15 int left = 0; 16 int right = nums.length-1; 17 test(nums, left, right); 18 return root; 19 } 20 21 //二分法挖坑建立二叉树--保证是平衡树 22 public void test(int[] nums, int left, int right){ 23 if(left<=right){ 24 int mid = (left+right)/2; 25 insert(nums[mid]); 26 //递归 27 test(nums, left, mid-1); 28 test(nums, mid+1, right); 29 } 30 } 31 32 //插入一个结点 33 public void insert(int val){ 34 TreeNode node = new TreeNode(val); 35 if(root==null){ 36 root = node; 37 }else{ 38 TreeNode current = root; 39 TreeNode parent; 40 while(true){ 41 parent = current; //parent保证在访问完左子树后还可以访问右子树,反之也成立 42 if(val<parent.val){ 43 current = parent.left; 44 if(current==null){ 45 parent.left = node; 46 return; 47 } 48 }else{ 49 current = parent.right; 50 if(current==null){ 51 parent.right = node; 52 return; 53 } 54 } 55 } 56 } 57 } 58 }