Дан отсортированный массив. Напишите функцию, которая создает сбалансированное дерево двоичного поиска с использованием элементов массива.
Примеры:
Input: Array {1, 2, 3}
Output: A Balanced BST
2
/ \
1 3
Input: Array {1, 2, 3, 4}
Output: A Balanced BST
3
/ \
2 4
/
1
Алгоритм
В предыдущем посте мы обсуждали создание BST из отсортированного связанного списка. Построение из отсортированного массива за время O (n) проще, поскольку мы можем получить средний элемент за время O (1). Ниже приведен простой алгоритм, в котором мы сначала находим средний узел списка и делаем его корнем дерева, которое будет построено.
1) Get the Middle of the array and make it root.
2) Recursively do same for left half and right half.
a) Get the middle of left half and make it left child of the root
created in step 1.
b) Get the middle of right half and make it right child of the
root created in step 1.
Ниже приведена реализация вышеуказанного алгоритма. Основной код, который создает сбалансированный BST, выделен.
C ++
#include<bits/stdc++.h>
using namespace std;
class TNode
{
public :
int data;
TNode* left;
TNode* right;
};
TNode* newNode( int data);
TNode* sortedArrayToBST( int arr[],
int start, int end)
{
if (start > end)
return NULL;
int mid = (start + end)/2;
TNode *root = newNode(arr[mid]);
root->left = sortedArrayToBST(arr, start,
mid - 1);
root->right = sortedArrayToBST(arr, mid + 1, end);
return root;
}
TNode* newNode( int data)
{
TNode* node = new TNode();
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
void preOrder(TNode* node)
{
if (node == NULL)
return ;
cout << node->data << " " ;
preOrder(node->left);
preOrder(node->right);
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7};
int n = sizeof (arr) / sizeof (arr[0]);
TNode *root = sortedArrayToBST(arr, 0, n-1);
cout << "PreOrder Traversal of constructed BST \n" ;
preOrder(root);
return 0;
}
|
С
#include<stdio.h> #include<stdlib.h>
struct TNode
{
int data;
struct TNode* left;
struct TNode* right;
};
struct TNode* newNode( int data);
struct TNode* sortedArrayToBST( int arr[], int start, int end)
{
if (start > end)
return NULL;
int mid = (start + end)/2;
struct TNode *root = newNode(arr[mid]);
root->left = sortedArrayToBST(arr, start, mid-1);
root->right = sortedArrayToBST(arr, mid+1, end);
return root;
}
struct TNode* newNode( int data)
{
struct TNode* node = ( struct TNode*)
malloc ( sizeof ( struct TNode));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
void preOrder( struct TNode* node)
{
if (node == NULL)
return ;
printf ( "%d " , node->data);
preOrder(node->left);
preOrder(node->right);
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7};
int n = sizeof (arr)/ sizeof (arr[0]);
struct TNode *root = sortedArrayToBST(arr, 0, n-1);
printf ( "n PreOrder Traversal of constructed BST " );
preOrder(root);
return 0;
}
|
Джава
class Node {
int data;
Node left, right;
Node( int d) {
data = d;
left = right = null ;
}
}
class BinaryTree {
static Node root;
Node sortedArrayToBST( int arr[], int start, int end) {
if (start > end) {
return null ;
}
int mid = (start + end) / 2 ;
Node node = new Node(arr[mid]);
node.left = sortedArrayToBST(arr, start, mid - 1 );
node.right = sortedArrayToBST(arr, mid + 1 , end);
return node;
}
void preOrder(Node node) {
if (node == null ) {
return ;
}
System.out.print(node.data + " " );
preOrder(node.left);
preOrder(node.right);
}
public static void main(String[] args) {
BinaryTree tree = new BinaryTree();
int arr[] = new int []{ 1 , 2 , 3 , 4 , 5 , 6 , 7 };
int n = arr.length;
root = tree.sortedArrayToBST(arr, 0 , n - 1 );
System.out.println( "Preorder traversal of constructed BST" );
tree.preOrder(root);
}
}
|
питон
class Node:
def __init__( self , d):
self .data = d
self .left = None
self .right = None
def sortedArrayToBST(arr):
if not arr:
return None
mid = ( len (arr)) / 2
root = Node(arr[mid])
root.left = sortedArrayToBST(arr[:mid])
root.right = sortedArrayToBST(arr[mid + 1 :])
return root
def preOrder(node):
if not node:
return
print node.data,
preOrder(node.left)
preOrder(node.right)
arr = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 ]
root = sortedArrayToBST(arr)
print "PreOrder Traversal of constructed BST " ,
preOrder(root)
|
C #
using System;
public class Node
{
public int data;
public Node left, right;
public Node( int d)
{
data = d;
left = right = null ;
}
}
public class BinaryTree
{
public static Node root;
public virtual Node sortedArrayToBST( int [] arr, int start, int end)
{
if (start > end)
{
return null ;
}
int mid = (start + end) / 2;
Node node = new Node(arr[mid]);
node.left = sortedArrayToBST(arr, start, mid - 1);
node.right = sortedArrayToBST(arr, mid + 1, end);
return node;
}
public virtual void preOrder(Node node)
{
if (node == null )
{
return ;
}
Console.Write(node.data + " " );
preOrder(node.left);
preOrder(node.right);
}
public static void Main( string [] args)
{
BinaryTree tree = new BinaryTree();
int [] arr = new int []{1, 2, 3, 4, 5, 6, 7};
int n = arr.Length;
root = tree.sortedArrayToBST(arr, 0, n - 1);
Console.WriteLine( "Preorder traversal of constructed BST" );
tree.preOrder(root);
}
}
|
Выход:
Preorder traversal of constructed BST
4 2 1 3 6 5 7
Сложность времени: O (n)
Ниже приведено рекуррентное отношение для sortedArrayToBST ().
T(n) = 2T(n/2) + C
T(n) --> Time taken for an array of size n
C --> Constant (Finding middle of array and linking root to left
and right subtrees take constant time)
Вышеупомянутое повторение может быть решено с помощью основной теоремы, так как она попадает в случай 1.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
Сортировка массива в сбалансированный BST
0.00 (0%) 0 votes