Учитывая обход Inorder для специального двоичного дерева, в котором ключ каждого узла больше, чем ключи в левом и правом дочерних элементах, создайте двоичное дерево и верните корень.
Примеры:
Input: inorder[] = {5, 10, 40, 30, 28}
Output: root of following tree
40
/ \
10 30
/ \
5 28
Input: inorder[] = {1, 5, 10, 40, 30,
15, 28, 20}
Output: root of following tree
40
/ \
10 30
/ \
5 28
/ / \
1 15 20
Идея, использованная в Построении дерева из заданных обходов Inorder и Preorder, может быть использована здесь. Пусть заданный массив равен {1, 5, 10, 40, 30, 15, 28, 20}. Максимальный элемент в данном массиве должен быть корневым. Элементы с левой стороны от максимального элемента находятся в левом поддереве, а элементы с правой стороны — в правом поддереве.
40
/ \
{1,5,10} {30,15,28,20}
Мы рекурсивно выполняем вышеприведенный шаг для левого и правого поддеревьев и, наконец, получаем следующее дерево.
40
/ \
10 30
/ \
5 28
/ / \
1 15 20
Алгоритм: buildTree ()
1) Найти индекс максимального элемента в массиве. Максимальный элемент должен быть корнем двоичного дерева.
2) Создайте новый узел дерева «корень» с данными в качестве максимального значения, найденного на шаге 1.
3) Вызовите buildTree для элементов до максимального элемента и сделайте построенное дерево левым поддеревом «root».
5) Вызовите buildTree для элементов после максимального элемента и сделайте построенное дерево правым поддеревом «root».
6) вернуть root.
Реализация: Ниже приведена реализация вышеуказанного алгоритма.
C ++
#include <bits/stdc++.h>
using namespace std;
class node
{
public :
int data;
node* left;
node* right;
};
int max( int inorder[], int strt, int end);
node* newNode( int data);
node* buildTree ( int inorder[], int start, int end)
{
if (start > end)
return NULL;
int i = max (inorder, start, end);
node *root = newNode(inorder[i]);
if (start == end)
return root;
root->left = buildTree (inorder, start, i - 1);
root->right = buildTree (inorder, i + 1, end);
return root;
}
int max ( int arr[], int strt, int end)
{
int i, max = arr[strt], maxind = strt;
for (i = strt + 1; i <= end; i++)
{
if (arr[i] > max)
{
max = arr[i];
maxind = i;
}
}
return maxind;
}
node* newNode ( int data)
{
node* Node = new node();
Node->data = data;
Node->left = NULL;
Node->right = NULL;
return Node;
}
void printInorder (node* node)
{
if (node == NULL)
return ;
printInorder (node->left);
cout<<node->data<< " " ;
printInorder (node->right);
}
int main()
{
int inorder[] = {5, 10, 40, 30, 28};
int len = sizeof (inorder)/ sizeof (inorder[0]);
node *root = buildTree(inorder, 0, len - 1);
cout << "Inorder traversal of the constructed tree is \n" ;
printInorder(root);
return 0;
}
|
С
#include<stdio.h> #include<stdlib.h>
struct node
{
int data;
struct node* left;
struct node* right;
};
int max( int inorder[], int strt, int end);
struct node* newNode( int data);
struct node* buildTree ( int inorder[], int start, int end)
{
if (start > end)
return NULL;
int i = max (inorder, start, end);
struct node *root = newNode(inorder[i]);
if (start == end)
return root;
root->left = buildTree (inorder, start, i-1);
root->right = buildTree (inorder, i+1, end);
return root;
}
int max ( int arr[], int strt, int end)
{
int i, max = arr[strt], maxind = strt;
for (i = strt+1; i <= end; i++)
{
if (arr[i] > max)
{
max = arr[i];
maxind = i;
}
}
return maxind;
}
struct node* newNode ( int data)
{
struct node* node = ( struct node*) malloc ( sizeof ( struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
void printInorder ( struct node* node)
{
if (node == NULL)
return ;
printInorder (node->left);
printf ( "%d " , node->data);
printInorder (node->right);
}
int main()
{
int inorder[] = {5, 10, 40, 30, 28};
int len = sizeof (inorder)/ sizeof (inorder[0]);
struct node *root = buildTree(inorder, 0, len - 1);
printf ( "\n Inorder traversal of the constructed tree is \n" );
printInorder(root);
return 0;
}
|
Джава
class Node
{
int data;
Node left, right;
Node( int item)
{
data = item;
left = right = null ;
}
}
class BinaryTree
{
Node root;
Node buildTree( int inorder[], int start, int end, Node node)
{
if (start > end)
return null ;
int i = max(inorder, start, end);
node = new Node(inorder[i]);
if (start == end)
return node;
node.left = buildTree(inorder, start, i - 1 , node.left);
node.right = buildTree(inorder, i + 1 , end, node.right);
return node;
}
int max( int arr[], int strt, int end)
{
int i, max = arr[strt], maxind = strt;
for (i = strt + 1 ; i <= end; i++)
{
if (arr[i] > max)
{
max = arr[i];
maxind = i;
}
}
return maxind;
}
void printInorder(Node node)
{
if (node == null )
return ;
printInorder(node.left);
System.out.print(node.data + " " );
printInorder(node.right);
}
public static void main(String args[])
{
BinaryTree tree = new BinaryTree();
int inorder[] = new int []{ 5 , 10 , 40 , 30 , 28 };
int len = inorder.length;
Node mynode = tree.buildTree(inorder, 0 , len - 1 , tree.root);
System.out.println( "Inorder traversal of the constructed tree is " );
tree.printInorder(mynode);
}
}
|
python3
class newNode:
def __init__( self , data):
self .data = data
self .left = None
self .right = None
def buildTree (inorder, start, end):
if start > end:
return None
i = Max (inorder, start, end)
root = newNode(inorder[i])
if start = = end:
return root
root.left = buildTree (inorder, start, i - 1 )
root.right = buildTree (inorder, i + 1 , end)
return root
def Max (arr, strt, end):
i, Max = 0 , arr[strt]
maxind = strt
for i in range (strt + 1 , end + 1 ):
if arr[i] > Max :
Max = arr[i]
maxind = i
return maxind
def printInorder (node):
if node = = None :
return
printInorder (node.left)
print (node.data, end = " " )
printInorder (node.right)
if __name__ = = '__main__' :
inorder = [ 5 , 10 , 40 , 30 , 28 ]
Len = len (inorder)
root = buildTree(inorder, 0 , Len - 1 )
print ( "Inorder traversal of the" ,
"constructed tree is " )
printInorder(root)
|
C #
using System;
public class Node
{
public int data;
public Node left, right;
public Node( int item)
{
data = item;
left = right = null ;
}
}
class GFG
{
public Node root;
public virtual Node buildTree( int [] inorder, int start,
int end, Node node)
{
if (start > end)
{
return null ;
}
int i = max(inorder, start, end);
node = new Node(inorder[i]);
if (start == end)
{
return node;
}
node.left = buildTree(inorder, start,
i - 1, node.left);
node.right = buildTree(inorder, i + 1,
end, node.right);
return node;
}
public virtual int max( int [] arr,
int strt, int end)
{
int i, max = arr[strt], maxind = strt;
for (i = strt + 1; i <= end; i++)
{
if (arr[i] > max)
{
max = arr[i];
maxind = i;
}
}
return maxind;
}
public virtual void printInorder(Node node)
{
if (node == null )
{
return ;
}
printInorder(node.left);
Console.Write(node.data + " " );
printInorder(node.right);
}
public static void Main( string [] args)
{
GFG tree = new GFG();
int [] inorder = new int []{5, 10, 40, 30, 28};
int len = inorder.Length;
Node mynode = tree.buildTree(inorder, 0,
len - 1, tree.root);
Console.WriteLine( "Inorder traversal of " +
"the constructed tree is " );
tree.printInorder(mynode);
} }
|
Выход:
Inorder traversal of the constructed tree is
5 10 40 30 28
Сложность времени: O (n ^ 2)
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
Построить специальное двоичное дерево из заданного обхода Inorder
0.00 (0%) 0 votes