Pre-order post-objednávat traversal

hlasů
14

V případě, že pre-order křížení binárního vyhledávacího stromu činí 6, 2, 1, 4, 3, 7, 10, 9, 11, jak se dostat na post-objednat traversal?

Položena 27/12/2010 v 11:13
zdroj uživatelem
V jiných jazycích...                            


11 odpovědí

hlasů
8

Pre-order = výstup hodnoty binárního stromu v pořadí aktuálního uzlu, pak levý podstrom, pak pravý podstrom.

Post-order = výstup hodnoty binárního stromu v pořadí levého podstromu, pak pravý podstrom je aktuální uzel.

V binárním vyhledávacím stromu, hodnoty všech uzlech v levém podstromu jsou menší, než je hodnota aktuálního uzlu; a podobně pro pravý podstrom. Z tohoto důvodu, pokud víte, start pre-objednávky výpisu binárního vyhledávacího stromu (tj hodnoty kořene uzlu), můžete snadno rozložit celý výpis na hodnotu kořenového uzlu, hodnoty uzlů v levého podstromu je, a hodnoty pravého podstromu se uzly.

Pro výstup strom v post-pořadí, je použita rekurze a výstup změnu pořadí. Tento úkol je ponecháno na čtenáři.

Odpovězeno 27/12/2010 v 11:28
zdroj uživatelem

hlasů
23

Ty jsou uvedeny v pre-order funkce traversal stromu, který je vytvořen tím, že dělá: výstup, traverz doleva, traverz doprava.

Jako post-order traversal pochází z BST, můžete odvodit Traversal in-pořadí (křížovou vlevo, výstup, traverz vpravo) z post-objednávat traversal tříděním čísel. Ve své příkladu je v pořadí průchod je 1, 2, 3, 4, 6, 7, 9, 10, 11.

Ze dvou traversals pak můžeme zkonstruovat původní strom. Využijme jednodušší příklad pro toto:

  • Pre-order: 2, 1, 4, 3
  • V-pořadí: 1, 2, 3, 4

Pre-order traversal nám dává kořen stromu as 2. in-pořadí traversal nám říká 1 spadá do levého podstromu a 3, 4 spadá do pravého dílčího stromu. Struktura levého podstromu je triviální, protože obsahuje jediný prvek. Pravém podstromu pre-order traversal je odvozena tím, že pořadí prvků v tomto sub-strom z původního pre-objednávat traversal: 4, 3. Z toho poznáváme kořen pravého dílčího stromu 4 a z průchod na objednávku (3, 4), víme, že 3 spadá do levého podstromu. Naše poslední strom vypadá takto:

  2
 / \
1   4
   /
  3

S stromové struktury, můžeme získat post-objednat traversal pěšky stromu: traverz doleva, traverz doprava, výstup. Pro tento příklad, post-pořadí Předávání je 1, 3, 4, 2.

Zobecnit algoritmus:

  1. První prvek v pre-objednávky průchod je kořen stromu. Prvky méně než kořene tvoří levý dílčí strom. Prvky větší než kořene tvoří pravý dílčí strom.
  2. Najít strukturu levého a pravého dílčích stromů pomocí kroku 1 s pre-objednávat traversal, který se skládá z prvků, jsme pracovali se, že je v této dílčí strom umístěn v pořadí, v jakém se objevují v původní pre-objednávat traversal.
  3. Procházet výsledný strom v post-cílem získat post-objednat traversal spojenou s daným pre-objednávat traversal.

Za použití výše uvedeného algoritmu, post-pořadí průchod spojený s pre-objednávky průchod na otázku je: 1, 3, 4, 2, 9, 11, 10, 7, 6. Jak je zde ponechán jako cvičení.

Odpovězeno 27/12/2010 v 11:36
zdroj uživatelem

hlasů
3

Na Ondřeje Tučný odpověď na bázi. Platí pro BST jediný
příklad:

     20  
    /  \  
   10  30  
   /\    \  
  6  15   35  

Preorder = 20 10 6 15 30 35
Post = 6 15 10 35 30 20

Pro BST, In předobjednání průchod; První prvek pole je 20. To je kořen našeho stromu. Všechna čísla v poli, které jsou menší než 20 tvoří její levý podstromu a větší množství tvoří pravý podstromu.

//N = number of nodes in BST (size of traversal array)
int post[N] = {0}; 
int i =0;

void PretoPost(int pre[],int l,int r){
  if(l==r){post[i++] = pre[l]; return;}
  //pre[l] is root
  //Divide array in lesser numbers and greater numbers and then call this function on them recursively  
  for(int j=l+1;j<=r;j++) 
      if(pre[j]>pre[l])
          break;
  PretoPost(a,l+1,j-1); // add left node
  PretoPost(a,j,r); //add right node
  //root should go in the end
  post[i++] = pre[l]; 
  return;
 }

Prosím, opravte mě, jestli existuje nějaký omyl.

Odpovězeno 05/04/2011 v 00:28
zdroj uživatelem

hlasů
2

dostanete výsledky pre-objednávat traversal. pak dal hodnoty do vhodného binárního vyhledávacího stromu a jen sledovat algoritmus traversal post-objednávky na získaném BST.

Odpovězeno 18/10/2011 v 06:28
zdroj uživatelem

hlasů
0

Vím, že to je starý, ale tam je lepší řešení.

Nemáme rekonstruovat BST získat post-order z pre-order.

Zde je jednoduchý python kód, který to dělá rekurzivně:

import itertools

def postorder(preorder):
    if not preorder:
        return []
    else:
        root = preorder[0]
        left = list(itertools.takewhile(lambda x: x < root, preorder[1:]))
        right = preorder[len(left) + 1:]
        return postorder(left) + postorder(right) + [root]

if __name__ == '__main__':
    preorder = [20, 10, 6, 15, 30, 35]
    print(postorder(preorder))

Výstup:

 [6, 15, 10, 35, 30, 20]

Vysvětlení :

Víme, že jsme v pre-order. To znamená, že kořen je v indexu 0seznamu hodnot v BST. A my víme, že prvky následující kořen jsou:

  • První: prvky menší než root, které patří do levého podstromu kořene
  • Za druhé: prvky větší než root, které patří do pravého podstromu kořene

Pak jsme jen zavolat rekurzivně funkce na obou podstromů (které jsou stále v pre-order) a poté řetěz left + right + root(což je post-order).

Odpovězeno 21/01/2015 v 21:22
zdroj uživatelem

hlasů
0

Pokud jste dostal preorder a chcete převést do postorder. Pak byste měli uvědomit, že v BST, aby vždy dát čísla ve vzestupném order.Thus máte i nezbytného stejně jako předobjednávku k vybudování stromu.

předobjednávka: 6, 2, 1, 4, 3, 7, 10, 9, 11

v pořádku: 1, 2, 3, 4, 6, 7, 9, 10, 11

A jeho postorder: 1 3 4 2 9 11 10 7 6

Odpovězeno 19/10/2017 v 09:06
zdroj uživatelem

hlasů
0

Zde pre-order křížení binárního vyhledávacího stromu je uveden v poli. Takže první prvek pre-objednávat pole bude kořen BST.We najde levou část BST a pravé části BST.All prvek v pre-objednávat pole je menší než kořen zůstane uzel a Všechny prvkem pre -objednat pole je větší než kořen bude hned uzel.

#include <bits/stdc++.h>
using namespace std;
int arr[1002];
int no_ans = 0;
int n = 1000;
int ans[1002] ;
int k = 0;

int find_ind(int l,int r,int x){
    int index = -1; 
    for(int i = l;i<=r;i++){
        if(x<arr[i]){
            index = i;
            break;
        }
    }
    if(index == -1)return index;
    for(int i =l+1;i<index;i++){
        if(arr[i] > x){
            no_ans = 1;
            return index;
        }
    }
    for(int i = index;i<=r;i++){
        if(arr[i]<x){
            no_ans = 1;
            return index;
        }
    }
    return index;

}

void postorder(int l ,int r){

    if(l < 0 || r >= n || l >r ) return;
    ans[k++] = arr[l];
    if(l==r) return;
    int index = find_ind(l+1,r,arr[l]);
    if(no_ans){
        return;
    }
    if(index!=-1){
        postorder(index,r);
        postorder(l+1,index-1);
    }
    else{
        postorder(l+1,r);
    }
}

int main(void){

    int t;
    scanf("%d",&t);
    while(t--){
        no_ans = 0;
        int n ;
        scanf("%d",&n);

        for(int i = 0;i<n;i++){
            cin>>arr[i];
        }
        postorder(0,n-1);
        if(no_ans){
            cout<<"NO"<<endl;
        }
        else{

            for(int i =n-1;i>=0;i--){
                cout<<ans[i]<<" ";
            }
            cout<<endl;
        }
    }

    return 0;
} 
Odpovězeno 30/12/2017 v 04:04
zdroj uživatelem

hlasů
0

Jak víme předobjednávku následovat mateřskou, levá, pravá série.

Pro konstrukci stromu musíme dodržovat několik základních steps-:

Váš dotaz se skládá z řady 6, 2,1,4,3,7,10,9,11

points-:

  1. První počet řad bude kořen (základ), tj 6

2.Find číslo, které je větší než 6, takže v této sérii 7 je první větší počet v této sérii se tak hned uzel od tady a nechal na toto číslo (7) je pomocí levé podstromy.

                      6
                    /   \
                   2     7
                 /  \     \
                1    4     10
                     /     / \
                     3     9  11

3.same způsobem sledovat základní pravidlo BST tj vlevo, kořen, vpravo

série po pořadí bude L, R, N tj 1,3,4,2,9,11,10,7,6

Odpovězeno 03/02/2018 v 14:32
zdroj uživatelem

hlasů
0

Jedná se o kód předobjednávku na postorder Traversal v pythonu. Jsem budování strom, takže si můžete najít jakýkoliv druh traversal

def postorder(root):
    if root==None:
        return
    postorder(root.left)
    print(root.data,end=" ")
    postorder(root.right)

def preordertoposorder(a,n):
    root=Node(a[0])
    top=Node(0)
    temp=Node(0)
    temp=None
    stack=[]
    stack.append(root)
    for i in range(1,len(a)):
        while len(stack)!=0 and a[i]>stack[-1].data:
            temp=stack.pop()
        if temp!=None:
            temp.right=Node(a[i])
            stack.append(temp.right)
        else:
            stack[-1].left=Node(a[i])
            stack.append(stack[-1].left)
    return root
class Node:
    def __init__(self,data):
        self.data=data
        self.left=None
        self.right=None  
a=[40,30,35,80,100]
n=5
root=preordertoposorder(a,n)
postorder(root)
# print(root.data)
# print(root.left.data)
# print(root.right.data)
# print(root.left.right.data)
# print(root.right.right.data)
Odpovězeno 29/07/2018 v 20:35
zdroj uživatelem

hlasů
0

Zde je úplný kód)

class Tree:
    def __init__(self, data = None):
        self.left = None
        self.right = None
        self.data = data

    def add(self, data):
        if self.data is None:
            self.data = data
        else:
            if data < self.data:
                if self.left is None:
                    self.left = Tree(data)
                else:
                    self.left.add(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Tree(data)
                else:
                    self.right.add(data)
    def inOrder(self):
        if self.data:
            if self.left is not None:
                self.left.inOrder()
            print(self.data)
            if self.right is not None:
                self.right.inOrder()

    def postOrder(self):
        if self.data:
            if self.left is not None:
                self.left.postOrder()
            if self.right is not None:
                self.right.postOrder()
            print(self.data)

    def preOrder(self):
        if self.data:
            print(self.data)
            if self.left is not None:
                self.left.preOrder()
            if self.right is not None:
                self.right.preOrder()
arr = [6, 2, 1, 4, 3, 7, 10, 9, 11]
root = Tree()
for i in range(len(arr)):
    root.add(arr[i])
print(root.inOrder())
Odpovězeno 27/05/2019 v 09:17
zdroj uživatelem

hlasů
0

Vzhledem k tomu, že je binární vyhledávací strom, bude nezbytného průchod vždy být tříděné prvky. (Vlevo <kořenový <vpravo)

takže můžete snadno psát své výsledky in-order traversal první, což je: 1,2,3,4,6,7,9,10,11

vzhledem k tomu, Předobjednejte: 6, 2, 1, 4, 3, 7, 10, 9, 11

V pořadí: vlevo, vpravo, kořenové Pre-order: kořen, vlevo, vpravo po pořadí: levá, pravá, kořenové

Nyní jsme se dostali z pre-order, že kořen je 6.

Nyní, za použití v objednávku a výsledky předběžné pořadí: Krok 1:

             6
            / \
           /   \
          /     \
         /       \
   {1,2,3,4}  {7,9,10,11}

Krok 2: další kořen je, za použití in-pořadí Traversal, 2:

             6
            / \
           /   \
          /     \
         /       \
        2  {7,9,10,11}
       / \
      /   \
     /     \
    1    {3,4}

Krok 3: Podobně, další kořen je 4:

             6
            / \
           /   \
          /     \
         /       \
        2  {7,9,10,11}
       / \
      /   \
     /     \
    1       4
           /
          3

Krok 4: další kořen má hodnotu 3, ale neobsahuje žádný jiný prvek zbývá být fit v dětském strom pro „3“. S ohledem na další kořen jako 7 nyní,

             6
            / \
           /   \
          /     \
         /       \
        2         7
       / \         \
      /   \       {9,10,11}
     /     \
    1       4
           /
          3

Krok 5: další kořen je 10:

             6
            / \
           /   \
          /     \
         /       \
        2         7
       / \         \
      /   \         10
     /     \       /  \
    1       4     9   11
           /
          3

To je, jak si můžete postavit na strom, a konečně najít svůj post-objednat traversal, která zní: 1, 3, 4, 2, 9, 11, 10, 7, 6

Odpovězeno 03/10/2019 v 13:57
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more