Forhåndsbestill til post-order traversering

stemmer
15

Hvis pre-order traversering av et binært søketre er 6, 2, 1, 4, 3, 7, 10, 9, 11, hvordan du får post-ordre traversering?

Publisert på 27/12/2010 klokken 10:13
kilden bruker
På andre språk...                            


11 svar

stemmer
8

Forhånds orden = utmating av verdiene av et binært tre i størrelsesorden av den aktuelle node, så venstre treet, så den høyre subtre.

Post-order = gi ut verdiene av et binært tre i rekkefølgen av venstre treet, deretter høyre treet, den gjeldende node.

I et binært søk tre, verdiene av alle nodene i det venstre subtre er mindre enn verdien av den aktuelle noden; og like etter den rette treet. Derfor hvis du vet starten på en pre-order dump av et binært søketre (dvs. rotnoden verdi), kan du enkelt dekomponere hele dump i rotnoden verdi, verdiene av venstre undertreet noder, og verdiene av høyre undertreet noder.

For å sende ut treet i post-rekkefølge, blir rekursjon og utgang omordning anvendt. Denne oppgaven blir igjen på leseren.

Svarte 27/12/2010 kl. 10:28
kilden bruker

stemmer
25

Du får pre-order traversering av treet, som er konstruert ved å gjøre: utgang, traverse venstre, krysser rett.

Som post-ordre traversering kommer fra en BST, kan du utlede i-order traversering (travers venstre, utgang, travers høyre) fra post-ordre traversering ved å sortere tallene. I eksempelet, er den i-rekkefølge traversering 1, 2, 3, 4, 6, 7, 9, 10, 11.

Fra to gjennomløping kan vi da konstruere den opprinnelige treet. La oss bruke et enklere eksempel på dette:

  • Forhåndsbestill: 2, 1, 4, 3
  • I-rekkefølge: 1, 2, 3, 4

Den pre-ordre traversering gir oss roten av treet som 2. i-rekkefølge traversering forteller oss 1 faller inn i den venstre sub-treet og 3, 4 faller inn i høyre sub-treet. Strukturen av den venstre sub-treet er triviell som den inneholder et enkelt element. Retten undertreet pre-order traversering utledes ved å ta rekkefølgen av elementene i denne sub-treet fra den opprinnelige pre-order traversering: 4, 3. Fra dette vet vi roten til høyre sub-treet er 4 og fra den i for traversering (3, 4) vet vi at 3 faller inn i venstre sub-treet. Vår endelige treet ser slik ut:

  2
 / \
1   4
   /
  3

Med trestrukturen, kan vi få den post-ordre traversering ved å gå treet: traverse venstre, krysser høyre, utgang. I dette eksemplet er den etter orden traversering 1, 3, 4, 2.

For å generalisere algoritme:

  1. Det første element i den forhånds orden traversering er roten av treet. Elementer mindre enn bunn danner den venstre sub-treet. Elementer større enn roten danner rett sub-treet.
  2. Finn strukturen i venstre og høyre sub-trær ved hjelp av trinn 1 med en pre-order traversering som består av elementene vi jobbet ut til å være i den sub-treet plassert i den rekkefølgen de vises i den opprinnelige pre-order traversering.
  3. Traversere den resulterende treet i etter for å få den etter orden traversering assosiert med den gitte forhånds orden traversering.

Ved hjelp av algoritmen ovenfor, etter orden traversering assosiert med pre-order traversering i spørsmålet er: 1, 3, 4, 2, 9, 11, 10, 7, 6. Få er det igjen som en øvelse.

Svarte 27/12/2010 kl. 10:36
kilden bruker

stemmer
3

Basert på Ondrej Tucny svar. Gyldig for BST eneste
eksempel:

     20  
    /  \  
   10  30  
   /\    \  
  6  15   35  

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

For en BST, In forhåndsbestilling traversering; første element i matrisen er 20. Dette er roten av treet vårt. Alle tall i matrisen som er mindre enn 20 danner dens venstre subtre og større tall danner rett subtre.

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

Rett meg hvis det er noen feil.

Svarte 04/04/2011 kl. 23:28
kilden bruker

stemmer
2

du får pre-order traversering resultater. deretter sette verdiene til et egnet binært søketre og bare følge etter for traversering algoritmen for den oppnådde BST.

Svarte 18/10/2011 kl. 05:28
kilden bruker

stemmer
0

Jeg vet dette er gammelt, men det er en bedre løsning.

Vi trenger ikke å rekonstruere en BST å få post-ordre fra pre-order.

Her er en enkel python kode som gjør det rekursivt:

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

Produksjon:

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

Forklaring :

Vi vet at vi er i pre-order. Dette betyr at roten er ved indeks 0av listen over verdiene i BST. Og vi vet at elementene følgende roten er:

  • først: elementene mindre enn den root, som tilhører den venstre subtre av roten
  • andre: de elementene som er større enn den rootsom hører til den høyre subtre av roten

Vi så bare ring rekursivt funksjonen på begge undertrær (som fortsatt er i pre-order) og deretter kjeden left + right + root(som er den post-rekkefølge).

Svarte 21/01/2015 kl. 21:22
kilden bruker

stemmer
0

Hvis du har fått forhåndsbestilling og du ønsker å konvertere den til Postorder. Da bør du huske på at i en BST for alltid gi tall i stigende order.Thus du har både Inorder samt forhåndsbestilling å konstruere et tre.

forhåndsbestille: 6, 2, 1, 4, 3, 7, 10, 9, 11

i rekkefølge: 1, 2, 3, 4, 6, 7, 9, 10, 11

Og dens Postorder: 1 3 4 2 9 11 10 7 6

Svarte 19/10/2017 kl. 09:06
kilden bruker

stemmer
0

Her pre-order traversering av et binært søketre er gitt i tabellen. Så første del av pre-order array vil roten av BST.We vil finne den venstre delen av BST og høyre del av BST.All elementet i pre-order rekke er mindre enn roten vil bli liggende node og All elementet i pre -Bestill matrise er større enn roten vil være rett node.

#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;
} 
Svarte 30/12/2017 kl. 04:04
kilden bruker

stemmer
0

Som vi vet forhåndsbestilling følge forelder, venstre, høyre-serien.

For å konstruere treet må vi følge noen grunnleggende trinn-:

spørsmålet ditt består av serie 6, 2,1,4,3,7,10,9,11

poeng:

  1. Første rekke serier vil være rot (parent), dvs. 6

2.Find antall som er større enn 6 så i denne serien 7 er første større antall i denne serien så rett node vil starte herfra og til venstre til dette nummeret (7) er din venstre subtre.

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

3.same måte følger den grunnleggende regelen for BST dvs. venstre, rot, ikke sant

rekken av post orden vil være L, R, N ie 1,3,4,2,9,11,10,7,6

Svarte 03/02/2018 kl. 14:32
kilden bruker

stemmer
0

Dette er koden for forhåndsbestilling til Postorder traversering i python. Jeg bygger et tre, slik at du kan finne alle typer traversering

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)
Svarte 29/07/2018 kl. 20:35
kilden bruker

stemmer
0

Her er full kode)

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())
Svarte 27/05/2019 kl. 09:17
kilden bruker

stemmer
0

Siden det er et binært søketre vil inorder traversering være alltid være de sorterte elementene. (Venstre <rot <høyre)

I så fall kan du enkelt skrive sine i orden traversering resultater først, som er: 1,2,3,4,6,7,9,10,11

gitt Forhånds rekkefølge: 6, 2, 1, 4, 3, 7, 10, 9, 11

In-rekkefølge: venstre, rot, rett Pre-order: root, venstre, høyre Post-rekkefølge: venstre, høyre, rot

nå, vi har fått fra pre-order, er at roten 6.

nå, ved hjelp av i-og for pre-order resultater: Trinn 1:

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

Trinn 2: neste roten er, ved hjelp av i-rekkefølge traversering, 2:

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

Trinn 3: På lignende måte er ved roten 4:

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

Trinn 4: neste roten er tre, men ingen andre element som er igjen for å passe på barnet treet for "3". Vurderer neste root som 7 nå,

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

Trinn 5: Neste roten er 10:

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

Dette er hvordan du kan konstruere et tre, og til slutt finner sin post-order traversering, som er: 1, 3, 4, 2, 9, 11, 10, 7, 6

Svarte 03/10/2019 kl. 13:57
kilden bruker

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