AMcoder - javascript, python, java, html, php, sql

Տեսակավորված կրկնակի կապակցված ցուցակը փոխակերպեք հավասարակշռված BST-ի տեղում մշտական ​​տարածության մեջ

Կա՞ որևէ տարբերակ տեսակավորված կրկնակի կապակցված ցուցակը տեղում հավասարակշռված BST-ի փոխակերպելու հաստատուն տարածության մեջ:

Լավագույն ուղիները, որոնք ես գտել եմ ([1], [2], [3]) լծակում են ռեկուրսիոն, բայց նրանց անհրաժեշտ է ավելի քան մշտական ​​տարածություն ռեկուրսիոն կույտի համար: Կարծում եմ, որ կարող է լինել ինդեքսները նախապես հաշվարկելու միջոց՝ առանց ռեկուրսիայի: Այնուամենայնիվ, ես չեմ կարող գտնել դրա համար լավ միջոց:

Այս հարցը հարցազրույցի հարցի լուծման մի մասն է, որը պահանջում է 2 BST միավորել հավասարակշռված որոնման ծառի մեջ՝ մշտական ​​տարածությամբ [4]:

[1] Տեսակավորված կրկնակի կապակցված ցուցակի փոխակերպում BST-ի
[2] http://www.geeksforgeeks.org/in-place-conversion-of-sorted-dll-to-balanced-bst/
[3] http://www.geeksforgeeks.org/sorted-linked-list-to-balanced-bst/
[4] http://www.careercup.com/question?id=5261732222074880


Պատասխանները:


1

Այն, ինչ փնտրում եք, նման է vine_to_tree(-ին), որը սովորաբար օգտագործվում է որպես երկուական որոնման ծառի հավասարակշռման մաս: Սովորական գործընթացը սկսվում է tree_to_vine()-ով, որը ծառ է ստեղծում միայն աջ հանգույցներով, ըստ էության, տեսակավորված կրկնակի կապակցված ցուցակ, որտեղից դուք սկսում եք: Այնուհետև vine_to_tree()-ն օգտագործվում է հավասարակշռված երկուական ծառ ստեղծելու համար: Սովորաբար մի քանի ֆունկցիաներ են ներգրավված, բայց դա ոչ ռեկուրսիվ ալգորիթմ է:

Կատարեք վեբ որոնում, և դուք պետք է գտնեք vine_to_tree(-ի) մի քանի օրինակներ, ինչպես այս մեկը.

http://web.eecs.umich.edu/~qstout/pap/CACM86.pdf

Այն, ինչ ցանկանում եք այս դեպքում, vine_to_tree()-ն է՝ օգտագործելով perfect_leaves(): Օրինակ կոդը:

struct node {
    size_t value;
    node *p_left;
    node *p_right;
};
// defines to use for double link list nodes
#define p_prev p_left
#define p_next p_right

size_t floor_power_of_two(size_t size)
{
size_t n = 1;
    while(n <= size)
        n = n + n;
    return n/2;
}

size_t ceil_power_of_two(size_t size)
{
size_t n = 1;
    while(n < size)
        n = n + n;
    return n;
}

// split vine nodes, placing all even (0, 2, 4, ...) leaves on left branches
// p_root->p_right->p_left = 0, p_root->p_right->p_right->p_left = 2
node * perfect_leaves(node * p_root, size_t leaf_count, size_t size)
{
node *p_scanner;
node *p_leaf;
size_t i;
size_t hole_count;
size_t next_hole;
size_t hole_index;
size_t leaf_positions;

    if(leaf_count == 0)
        return p_root;
    leaf_positions = ceil_power_of_two(size+1)/2;
    hole_count = leaf_positions - leaf_count;
    hole_index = 1;
    next_hole = leaf_positions / hole_count;
    p_scanner = p_root;
    for(i = 1; i < leaf_positions; i += 1){
        if(i == next_hole){
            p_scanner = p_scanner->p_right;
            hole_index = hole_index + 1;
            next_hole = (hole_index * leaf_positions) / hole_count;
        } else {
            p_leaf = p_scanner->p_right;
            p_scanner->p_right = p_leaf->p_right;
            p_scanner = p_scanner->p_right;
            p_scanner->p_left = p_leaf;
            p_leaf->p_right = NULL;
        }
    }
    return p_root;
}

//  left rotate sub-tree
node * compression(node * p_root, size_t count)
{
node *p_scanner;
node *p_child;
size_t i;
    p_scanner = p_root;
    for(i = 1; i <= count; i += 1){
        p_child = p_scanner->p_right;
        p_scanner->p_right = p_child->p_right;
        p_scanner = p_scanner->p_right;
        p_child->p_right = p_scanner->p_left;
        p_scanner->p_left = p_child;
    }
    return p_root;
}

//  convert vine to perfect balanced tree
node * vine_to_tree(node *p_root, size_t size)
{
size_t leaf_count; // # of leaves if not full tree
    leaf_count = size + 1 - floor_power_of_two(size+1);
    perfect_leaves(p_root, leaf_count, size);
    size = size - leaf_count;
    while(size > 1){
        compression(p_root, size / 2);
        size = size / 2;
    }
    return p_root;
}
13.11.2015
Նոր նյութեր

Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..