Pre-order do przechodzenia post-zlecenia

głosy
14

Jeżeli przejścia pre-order z wyszukiwania binarnego drzewa jest 6, 2, 1, 4, 3, 7, 10, 9, 11, jak uzyskać przechodzenie po zamówienie?

Utwórz 27/12/2010 o 11:13
źródło użytkownik
W innych językach...                            


11 odpowiedzi

głosy
8

Pre-order = wyprowadzania wartości binarne drzewo w celu bieżącego węzła, a następnie w lewo poddrzewa, a następnie prawym poddrzewie.

Post-order = wyprowadzania wartości binarnego drzewa w kolejności od lewego poddrzewa, a następnie prawy poddrzewa, The prąd węzła.

W binarnym wyszukiwania drzewa, wartości wszystkich węzłów w lewym poddrzewie są mniejsze niż wartość bieżącego węzła; i podobnie dla prawego poddrzewa. Stąd, jeśli wiesz rozpoczęcia wysypisko pre-order z wyszukiwania binarnego drzewa (czyli wartości nasady węzła), można łatwo rozłożyć cały zrzut do wartości korzenia, wartości węzłów w Left poddrzewa, a wartości węzły prawym poddrzewie jest.

Do wyjścia drzewo w post-order, stosowana jest rekurencja i wyjście zmiana kolejności. To zadanie jest pozostawione na czytelnika.

Odpowiedział 27/12/2010 o 11:28
źródło użytkownik

głosy
23

Otrzymujesz przechodzenie pre-order z drzewa, które jest zbudowany przez robi: wyjście, Traverse lewo, trawers w prawo.

Ponieważ przechodzenie post-order pochodzi z BST można wywnioskować przechodzenie na zamówienie (przy przechodzeniu przez lewy, wyjście, trawers w prawo) od przechodzenia post-zlecenia sortując numery. W przykładzie przemierzania w rzędu wynosi 1, 2, 3, 4, 6, 7, 9, 10, 11.

Od dwóch przechodzenia przez to możemy skonstruować oryginalnego drzewa. Użyjmy prostszy przykład na to:

  • Zamów: 2, 1, 4, 3
  • W prawidłowej kolejności: 1, 2, 3, 4

Traversal pre-order daje nam korzeń drzewa jako 2. w celu przejścia-1 mówi nam wpada lewym sub-tree i 3, 4 wpada do prawego poddrzewa. Struktura lewego poddrzewa jest trywialny, ponieważ zawiera pojedynczy element. Prawo poddrzewo za pre-order przechodzenie jest wywnioskować poprzez kolejność elementów w tym sub-tree z oryginalnego pre-order przechodzenie: 4, 3. Z tego wiemy korzeń prawego poddrzewa wynosi 4 a z przechodzenia na zamówienie (3, 4) wiemy, że 3 wpada do lewego poddrzewa. Nasza ostateczna drzewo wygląda następująco:

  2
 / \
1   4
   /
  3

Dzięki strukturze drzewa, możemy uzyskać przechodzenie po zamówienie chodząc drzewa: trawers w lewo, w prawo, przemierzać wyjście. W tym przykładzie, po przejścia rzędu wynosi 1, 3, 4, 2.

Uogólnić algorytm:

  1. Pierwszy element przechodzenia pre-order jest korzeniem drzewa. Elementy mniej niż korzenia tworzą lewy sub-tree. Elementy większe niż korzenia tworzą właściwą sub-tree.
  2. Znajdź strukturę lewej i prawej podrzędnych drzew korzystających krok 1 z przechodzenia pre-order, który składa się z elementów opracowaliśmy być w tym sub-tree umieszczone w kolejności, w jakiej pojawiają się w oryginalnym pre-order przechodzenie.
  3. Przemierzać powstałego drzewa w post-aby uzyskać przechodzenie po zamówień powiązanych z danym przechodzenie pre-order.

Stosując powyższy algorytm przemierzania po celu związany z przechodzenie wstępnie rzędu w odpowiedzi na pytanie brzmi: 1, 3, 4, 2, 9, 11, 10, 7, 6. Pierwsze nie pozostaje jako wysiłku.

Odpowiedział 27/12/2010 o 11:36
źródło użytkownik

głosy
3

Na podstawie odpowiedzi Ondrej Tučný użytkownika. Ważny dla BST tylko
przykład:

     20  
    /  \  
   10  30  
   /\    \  
  6  15   35  

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

Dla BST, W preorder przechodzenie; Pierwszy element tablicy jest 20. To jest źródłem naszego drzewa. Wszystkie liczby w tablicy, które są mniejsze niż 20 stanowią jego lewy poddrzewa i większe numery tworzą właściwą poddrzewa.

//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;
 }

Proszę mnie poprawić, jeśli istnieje jakakolwiek pomyłka.

Odpowiedział 05/04/2011 o 00:28
źródło użytkownik

głosy
2

podane są na pre-order wyniki przemierzania. następnie umieścić wartości do odpowiedniego binarne drzewo poszukiwań i wystarczy postępować zgodnie z post-zlecenia algorytm przejścia dla otrzymanego BST.

Odpowiedział 18/10/2011 o 06:28
źródło użytkownik

głosy
0

Wiem, że to stary, ale tam jest lepszym rozwiązaniem.

Nie mamy do zrekonstruowania BST uzyskać post-zlecenia z pre-order.

Oto prosty kod Pythona, który robi to rekurencyjnie:

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))

Wydajność:

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

Objaśnienie :

Wiemy, że jesteśmy w pre-order. Oznacza to, że korzeń jest w indeksie 0listy wartości w BST. I wiemy, że elementy są następujące root:

  • Po pierwsze: mniej niż elementy root, które należą do lewego poddrzewem korzenia
  • Drugi: elementy większe niż root, które należą do prawego poddrzewa o korzeniu

Następnie wystarczy zadzwonić rekursywnie funkcji obu poddrzew (które nadal są w pre-order), a następnie łańcuch left + right + root(który jest post-order).

Odpowiedział 21/01/2015 o 21:22
źródło użytkownik

głosy
0

Jeśli zostały podane zamĂłwienia przedpremierowego i chcesz przekształcić go w postorder. Następnie należy pamiętać, że w BST, aby zawsze podać numery w kolejności rosnącej order.Thus masz zarówno Inorder jak również przedsprzedaży do skonstruowania drzewo.

przed Sprzedaż: 6, 2, 1, 4, 3, 7, 10, 9, 11

w celu: 1, 2, 3, 4, 6, 7, 9, 10, 11

I jego postorder: 1 3 4 2 9 11 10 7 6

Odpowiedział 19/10/2017 o 09:06
źródło użytkownik

głosy
0

Tutaj pre-order przechodzenie z wyszukiwania binarnego drzewa podano w tablicy. Więc 1st elementem tablicy pre-order będzie korzeniem BST.We znajdzie lewej części BST i prawej części BST.All element w tablicy pre-order jest mniejsza niż korzeń będzie pozostawiony węzeł i cały element pre -order tablicy jest większa niż korzeń zostanie prawy węzeł.

#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;
} 
Odpowiedział 30/12/2017 o 04:04
źródło użytkownik

głosy
0

Jak wiemy preorder śledzić nadrzędnego, lewo, prawo serii.

W celu skonstruowania drzewa musimy przestrzegać kilku podstawowych kroki-:

Twoje pytanie składa się z serii 6, 2,1,4,3,7,10,9,11

zwrotnica-:

  1. Pierwszy numer serii będzie root (rodzic), czyli 6

2.Find numer, który jest większy niż 6 więc w tej serii 7 to pierwsza większa liczba w tej serii tak prawy węzeł będzie począwszy od tutaj i od lewej do tej liczby (7) jest lewym poddrzewa.

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

3.same sposób podążać za podstawową zasadę IE BST lewo, korzenia, tuż

Seria aby po będzie L, R, N tj 1,3,4,2,9,11,10,7,6

Odpowiedział 03/02/2018 o 14:32
źródło użytkownik

głosy
0

Jest to kod z przedsprzedaży do postorder przechodzenie w Pythonie. Ja konstruowania drzewa, dzięki czemu można znaleźć każdy rodzaj przechodzenie

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)
Odpowiedział 29/07/2018 o 20:35
źródło użytkownik

głosy
0

Oto pełny kod)

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())
Odpowiedział 27/05/2019 o 09:17
źródło użytkownik

głosy
0

Ponieważ jest to wyszukiwanie binarne drzewo, przechodzenie inorder będzie zawsze być posortowane elementy. (Lewa <root <prawej)

tak, można łatwo napisać swoje wyniki w rzędu przemierzania pierwszy, który jest: 1,2,3,4,6,7,9,10,11

Wstępne dane zamówienia: 6, 2, 1, 4, 3, 7, 10, 9, 11

Na zamówienie: lewy, prawy, korzeń pre-order: korzeń, lewo, prawo post-order: w lewo, w prawo, korzenia

Teraz mamy z pre-order, że korzeń jest 6.

Posługując się w prawidłowej kolejności, a wyniki wstępnego kolejności: Etap 1:

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

Etap 2: przy korzeń, przy użyciu przechodzenie w prawidłowej kolejności, 2:

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

Etap 3: Podobnie, obok głównego 4:

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

Krok 4: następny korzeń jest 3, ale żaden inny element jest pozostały, aby być zdrowym na drzewie dzieci na „3”. Biorąc pod uwagę jako kolejny pierwiastek 7 teraz

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

Krok 5: Następnie korzeń jest 10:

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

W ten sposób można skonstruować drzewo, i wreszcie znaleźć swoje przechodzenie po porządku, który jest: 1, 3, 4, 2, 9, 11, 10, 7, 6

Odpowiedział 03/10/2019 o 13:57
źródło użytkownik

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