将排序数组转为平衡二叉查找树
2012-09-20 10:32
155 查看
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
If you are having hard time in understanding my previous post:
Largest Binary Search Tree (BST) in a binary tree, do not fret as that problem is a comparably trickier tree problem for an interview session. But that should not be an excuse for you to not improve your ability to think recursively (without your brain
stack being overflowed of course ).
Recursion is a very powerful problem-solving mechanism, and you would not go very far without it during an interview session. Here might be an easier tree problem for you to start before you hop on those challenging ones.
Hint:
This question is highly recursive in nature. Think of how binary search works.
An example of a height-balanced tree. A height-balanced tree is a tree whose subtrees differ in height by no more than one and the subtrees are height-balanced, too.
Solution:
If you would have to choose an array element to be the root of a balanced BST, which element would you pick? The root of a balanced BST should be the middle element from the sorted array.
You would pick the middle element from the sorted array in each iteration. You then create a node in the tree initialized with this element. After the element is chosen, what is left? Could you identify the sub-problems within the problem?
There are two arrays left — The one on its left and the one on its right. These two arrays are the sub-problems of the original problem, since both of them are sorted. Furthermore, they are subtrees of the current node’s left and right child.
The code below creates a balanced BST from the sorted array in O(N) time (N is the number of elements in the array). Compare how similar the code is to a binary search algorithm. Both are using the divide and conquer methodology.
http://www.leetcode.com/2010/11/convert-sorted-array-into-balanced.html
If you are having hard time in understanding my previous post:
Largest Binary Search Tree (BST) in a binary tree, do not fret as that problem is a comparably trickier tree problem for an interview session. But that should not be an excuse for you to not improve your ability to think recursively (without your brain
stack being overflowed of course ).
Recursion is a very powerful problem-solving mechanism, and you would not go very far without it during an interview session. Here might be an easier tree problem for you to start before you hop on those challenging ones.
Hint:
This question is highly recursive in nature. Think of how binary search works.
An example of a height-balanced tree. A height-balanced tree is a tree whose subtrees differ in height by no more than one and the subtrees are height-balanced, too.
Solution:
If you would have to choose an array element to be the root of a balanced BST, which element would you pick? The root of a balanced BST should be the middle element from the sorted array.
You would pick the middle element from the sorted array in each iteration. You then create a node in the tree initialized with this element. After the element is chosen, what is left? Could you identify the sub-problems within the problem?
There are two arrays left — The one on its left and the one on its right. These two arrays are the sub-problems of the original problem, since both of them are sorted. Furthermore, they are subtrees of the current node’s left and right child.
The code below creates a balanced BST from the sorted array in O(N) time (N is the number of elements in the array). Compare how similar the code is to a binary search algorithm. Both are using the divide and conquer methodology.
BinaryTree* sortedArrayToBST(int arr[], int start, int end) { if (start > end) return NULL; // same as (start+end)/2, avoids overflow. int mid = start + (end - start) / 2; BinaryTree *node = new BinaryTree(arr[mid]); node->left = sortedArrayToBST(arr, start, mid-1); node->right = sortedArrayToBST(arr, mid+1, end); return node; } BinaryTree* sortedArrayToBST(int arr[], int n) { return sortedArrayToBST(arr, 0, n-1); }
http://www.leetcode.com/2010/11/convert-sorted-array-into-balanced.html
相关文章推荐
- 将排序链表转为平衡二叉查找树
- 数组按照拼音首字母排序后转为字符串
- 有序数组转为二叉查找树
- 算法:有序数组转为平衡的二叉搜索树
- 将有序数组转变成平衡二叉查找树
- Leetcode 108 Convert Sorted Array to Binary Search Tree 有序数组构造平衡二叉查找树
- 【LeetCode题目记录-9】排序后的数组生成平衡的二叉搜索树
- 包含对象为Integer的List列表转为Integer数组并排序的简单方法
- 练习LINQ:同时操作二维和一维数组,把二维数组转为一维,计算一维和二维值,字符串组合,计算数组和,数组筛选,排序
- js List<Map> 将偏平化的数组转为树状结构并排序
- Convert Sorted Array to Binary Search Tree (递增数组建高度平衡的二叉查找树)【leetcode】
- 177 - 排序数组转为二叉树
- php 数组按数组中的某个字段值排序
- 数组中的排序问题
- 一到关于数组排序的算法题
- [Unity&C#]使用?:表达式比较整型数组大小并对其排序
- 数组的排序
- mips 指令对指定的数组进行排序
- perl快速获得数字在数组中的排序
- PHP:多维数组排序