Существует множество приложений, в которых нам нужно найти минимальное значение ключа в двоичном дереве поиска или отсортированном массиве. Например, рассмотрим проектирование системы управления памятью, в которой свободные узлы расположены в BST. Найти наиболее подходящий для запроса ввода.
Ceil Value Node : Узел с наименьшими данными, большими или равными значению ключа.
Представьте, что мы движемся вниз по дереву, и предположим, что мы являемся корневым узлом. Сравнение дает три возможности,
А) Корневые данные равны ключевым. Мы сделали, корневые данные имеют значение ceil.
B) Корневые данные <значение ключа, конечно, значение ceil не может быть в левом поддереве. Перейдите к поиску на правом поддереве как уменьшенном экземпляре проблемы.
C) Корневые данные> значение ключа, значение ceil может быть в левом поддереве. Мы можем найти узел с данными большего размера, чем значение ключа в левом поддереве, если не сам корень будет узлом ceil.
Вот код для значения ceil.
C ++
#include <bits/stdc++.h>
using namespace std;
class node {
public :
int key;
node* left;
node* right;
};
node* newNode( int key)
{
node* Node = new node();
Node->key = key;
Node->left = NULL;
Node->right = NULL;
return (Node);
}
int Ceil(node* root, int input)
{
if (root == NULL)
return -1;
if (root->key == input)
return root->key;
if (root->key < input)
return Ceil(root->right, input);
int ceil = Ceil(root->left, input);
return ( ceil >= input) ? ceil : root->key;
}
int main()
{
node* root = newNode(8);
root->left = newNode(4);
root->right = newNode(12);
root->left->left = newNode(2);
root->left->right = newNode(6);
root->right->left = newNode(10);
root->right->right = newNode(14);
for ( int i = 0; i < 16; i++)
cout << i << " " << Ceil(root, i) << endl;
return 0;
}
|
С
#include <stdio.h> #include <stdlib.h>
struct node {
int key;
struct node* left;
struct node* right;
};
struct node* newNode( int key)
{
struct node* node = ( struct node*) malloc ( sizeof ( struct node));
node->key = key;
node->left = NULL;
node->right = NULL;
return (node);
}
int Ceil( struct node* root, int input)
{
if (root == NULL)
return -1;
if (root->key == input)
return root->key;
if (root->key < input)
return Ceil(root->right, input);
int ceil = Ceil(root->left, input);
return ( ceil >= input) ? ceil : root->key;
}
int main()
{
struct node* root = newNode(8);
root->left = newNode(4);
root->right = newNode(12);
root->left->left = newNode(2);
root->left->right = newNode(6);
root->right->left = newNode(10);
root->right->right = newNode(14);
for ( int i = 0; i < 16; i++)
printf ( "%d %d\n" , i, Ceil(root, i));
return 0;
}
|
Джава
class Node {
int data;
Node left, right;
Node( int d)
{
data = d;
left = right = null ;
}
}
class BinaryTree {
Node root;
int Ceil(Node node, int input)
{
if (node == null ) {
return - 1 ;
}
if (node.data == input) {
return node.data;
}
if (node.data < input) {
return Ceil(node.right, input);
}
int ceil = Ceil(node.left, input);
return (ceil >= input) ? ceil : node.data;
}
public static void main(String[] args)
{
BinaryTree tree = new BinaryTree();
tree.root = new Node( 8 );
tree.root.left = new Node( 4 );
tree.root.right = new Node( 12 );
tree.root.left.left = new Node( 2 );
tree.root.left.right = new Node( 6 );
tree.root.right.left = new Node( 10 );
tree.root.right.right = new Node( 14 );
for ( int i = 0 ; i < 16 ; i++) {
System.out.println(i + " " +
tree.Ceil(tree.root, i));
}
}
}
|
питон
class Node:
def __init__( self , data):
self .key = data
self .left = None
self .right = None
def ceil(root, inp):
if root = = None :
return - 1
if root.key = = inp :
return root.key
if root.key < inp:
return ceil(root.right, inp)
val = ceil(root.left, inp)
return val if val > = inp else root.key
root = Node( 8 )
root.left = Node( 4 )
root.right = Node( 12 )
root.left.left = Node( 2 )
root.left.right = Node( 6 )
root.right.left = Node( 10 )
root.right.right = Node( 14 )
for i in range ( 16 ):
print "% d % d" % (i, ceil(root, i))
|
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 int Ceil(Node node, int input)
{
if (node == null ) {
return -1;
}
if (node.data == input) {
return node.data;
}
if (node.data < input) {
return Ceil(node.right, input);
}
int ceil = Ceil(node.left, input);
return (ceil >= input) ? ceil : node.data;
}
public static void Main( string [] args)
{
BinaryTree tree = new BinaryTree();
BinaryTree.root = new Node(8);
BinaryTree.root.left = new Node(4);
BinaryTree.root.right = new Node(12);
BinaryTree.root.left.left = new Node(2);
BinaryTree.root.left.right = new Node(6);
BinaryTree.root.right.left = new Node(10);
BinaryTree.root.right.right = new Node(14);
for ( int i = 0; i < 16; i++) {
Console.WriteLine(i + " " + tree.Ceil(root, i));
}
}
}
|
Выход:
0 2
1 2
2 2
3 4
4 4
5 6
6 6
7 8
8 8
9 10
10 10
11 12
12 12
13 14
14 14
15 -1
Упражнение:
1. Измените приведенный выше код, чтобы найти минимальное значение ключа ввода в бинарном дереве поиска.
2. Напишите аккуратный алгоритм, чтобы найти значения floor и ceil в отсортированном массиве. Убедитесь, что обработаны все возможные граничные условия.
— Венки . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
Пол и Потолок из BST
0.00 (0%) 0 votes