排序数组构造AVL树

原创 2015年11月18日 17:15:21

题目大意:假设排序数组中没有重复的元素,利用数组的元素构建一颗平衡二叉树。

思路分析:如果直接构造一颗平衡二叉树,代码量会比较大,而且也不容易实现。注意题目的意思,是利用排序数组来构建平衡二叉树。所以,需要好好利用排序的特点。再来看看,一颗平衡二叉树最基本的要求是树种的结点均匀分布,我们可以利用二分查找来解决这个问题。

1)取数组的中间位置的元素,作为根节点

2)在中间位置元素的左边部分的中间元素作为根节点的左孩子结点

3)在中间位置元素的右边部分的中间元素作为根节点的右孩子结点

4)递归执行

Java代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
	public TreeNode sortedArrayToBST(int[] nums) {
        if (nums.length == 0)
        	return null;
		
		return sortedArrayToBSTHelper(nums, 0, nums.length-1);
    }

	private TreeNode sortedArrayToBSTHelper(int[] nums, int start, int end) {
		TreeNode rootNode = null;
		if (start <= end) {               // 利用二分查找得到左右子结点,保证均匀分布
			int mid = (start + end) / 2;
			rootNode = new TreeNode(nums[mid]);
			rootNode.left = sortedArrayToBSTHelper(nums, start, mid-1);
			rootNode.right = sortedArrayToBSTHelper(nums, mid+1, end);
		}
				
		return rootNode;
	}
}




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

AVL树(平衡二叉树)的构造

特点:平衡二叉树要求对于每一个节点来说,他的左右子树的高度之差不超过1,如果插入或者删除一个结点使得高度之差大于1,就要进行节点之间的旋转(左旋或者右旋),将二叉树重新维持在一个平衡状态。 解决了二...

AVL树的构造实现

今天接触的是平衡二叉查找树,对于AVL树来说相比之前的数据结构稍微多了一些需要注意的地方,照例在此总结总结让自己巩固一二。 首先是使用AVL树的动机: 我们知道AVL树本质上是排序二叉树的一类特例...

二叉排序树、红黑树、AVL树最简单的理解

前言[为什么写这篇]之前在知乎上看过一个提问:为什么红黑树比AVL树用的场景更为广泛,红黑树在 STL 和 Linux 都有一定的运用。而AVL树也在 Windows进程地址空间管理 中得到了使用。既...

二叉排序树(AVL树)源码

二叉排序树(AVL树)源码AVLTree.h源码#pragma once #include "stdafx.h" #include using namespace std; class AVLNod...

BST二叉排序树,AVL平衡二叉树,RBT红黑树,B-树,B+树,B*树

BST二叉搜索树,AVL平衡二叉树,RBT红黑树,B-树,B+树,B*树

Lintcode 将数组重新排序以构造最小值

给定一个整数数组,请将其重新排序,以构造最小值。  注意事项 The result may be very large, so you need to return a string ...

~AVL树中构造双旋的情形~

~AVL树中构造双旋的情形~
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)