Előrendelhető utáni sorrendben bejárás

szavazat
14

Ha az előrendelést bejárás egy bináris keresési fa 6, 2, 1, 4, 3, 7, 10, 9, 11, hogyan lehet a poszt-order bejárás?

A kérdést 27/12/2010 11:13
a forrás felhasználó
Más nyelveken...                            


11 válasz

szavazat
8

Előrendelhető = kimenetre értékeit bináris fa a sorrendben az aktuális csomópont, majd a bal részfa, majd a jobb oldali részfa.

Utáni sorrendben = kimenetre értékeit bináris fa a sorrendben a bal részfa, akkor a jobb részfa, a jelenlegi csomópontot.

Egy bináris keresési fa, az értékek minden csomópont a bal részfa kevesebb, mint az értéke az aktuális csomópont; és egyaránt a jobb részfa. Ezért, ha tudod, hogy a kezdete egy előrendelést lerakó egy bináris keresési fa (azaz a gyökér csomópont értékét), akkor könnyen lebomlanak a teljes lerakó a gyökér csomópont értékét, az értékek a bal részfa csomópontjaiban, és az értékek a jobb részfa csomópontjain.

Kimenet az fa utáni sorrendben, rekurzió és kimeneti átrendezésére alkalmazzák. Ez a feladat marad az olvasóra.

Válaszolt 27/12/2010 11:28
a forrás felhasználó

szavazat
23

Ön mivel az előrendelést bejárás a fa, amely úgy van kialakítva rakni: kimenet, lengőkarokkal balra, jobbra haladnak.

Mivel a post-order bejárás származik BST, akkor lehet következtetni az in-sorrendben bejárás (mozgnak balra, kimenet, áthaladási jobbra) a post-order bejárás rendezésével a számokat. Az a példát, az in-order bejárás jelentése 1, 2, 3, 4, 6, 7, 9, 10, 11.

Két bejárási tudjuk majd megépíteni az eredeti fa. Vegyünk egy egyszerűbb példa erre:

  • Előrendelés: 2, 1, 4, 3
  • In-sorrendben: 1, 2, 3, 4

A pre-order bejárás ad nekünk a gyökér a fa, mint 2. Az in-order bejárás elmondja 1 beleesik a bal al-fa és a 3, 4 beleesik a megfelelő al-fa. A szerkezet a bal részfa triviális, mivel ez tartalmazza egyetlen elem. A jobb részfa előrendelési bejárás alapján vezettük le vesz a sorrendben az elemek ebben a sub-tree az eredeti előrendelési bejárás: 4, 3. Ebből tudjuk a gyökér a jobb al-fa 4. és az in-order bejárás (3, 4) tudjuk, hogy a 3 beleesik a bal al-fa. A végső fa így néz ki:

  2
 / \
1   4
   /
  3

A fa struktúra, akkor kap a poszt-sorrendben bejárás séta a fa: elmozdulási balra áthaladva jobbra, kimenet. Ebben a példában, a poszt-order bejárás jelentése 1, 3, 4, 2.

Általánosítani az algoritmus:

  1. Az első elem a pre-order bejárás a gyökér a fa. Elements kevesebb, mint a gyökér képezik a bal al-fa. Elements nagyobb, mint a gyökér alkotnak a megfelelő al-fa.
  2. Keresse meg a szerkezet a bal és a jobb részfákat alkalmazásával az 1. lépésben a pre-order bejárás áll, hogy az elemek dolgoztunk ki, hogy az, hogy a sub-tree helyezni a sorrendben, ahogy az eredeti előrendelési bejárás.
  3. Áthalad a kapott fa utáni érdekében, hogy a poszt-sorrendben bejárás társított adott előrendelést bejárás.

A fenti algoritmus, a poszt-sorrendben bejárás társított pre-order bejárás a kérdés: 1, 3, 4, 2, 9, 11, 10, 7, 6. Megközelítés marad, mint egy gyakorlat.

Válaszolt 27/12/2010 11:36
a forrás felhasználó

szavazat
3

Ennek alapján Ondrej Tucny válaszát. Érvényes BST csak
példa:

     20  
    /  \  
   10  30  
   /\    \  
  6  15   35  

Előrendelés = 20 10 6 15 30 35
post = 6 15 10 35 30 20

Egy BST, In Előrendelés bejárás; első eleme tömb 20. Ez a gyökere a fát. Minden szám a tömbben, amelyek kisebb, mint 20 képeznek a bal részfa és nagyobb számban képeznek jobb részfa.

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

Kérjük, helyes, ha van olyan hiba.

Válaszolt 05/04/2011 00:28
a forrás felhasználó

szavazat
2

akkor kapnak az előrendelést bejárás eredménye. aztán az értékeket egy megfelelő bináris keresési fa és kövesse a poszt-sorrendben bejáráshoz a kapott BST.

Válaszolt 18/10/2011 06:28
a forrás felhasználó

szavazat
0

Tudom, hogy ez a régi, de van egy jobb megoldás.

Nem kell, hogy rekonstruálják a BST, hogy a poszt-sorrendben az előrendeléseket.

Itt van egy egyszerű python kódot csinálja rekurzívan:

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

output:

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

Magyarázat :

Tudjuk, hogy mi van a pre-order. Ez azt jelenti, hogy a gyökér a mutató 0a értékeinek listáját a BST. És tudjuk, hogy az elemek követő gyökér:

  • az első: az elemek kisebb, mint a root, amely tartozik a bal részfa a gyökér
  • a második: az elemek nagyobb, mint az root, amely tartozik a jobb részfa gyökerének

Ezután csak hívja rekurzív függvény mindkét részfa (ami még mindig vannak előre sorrendben), majd lánc left + right + root(ami a poszt-sorrendben).

Válaszolt 21/01/2015 21:22
a forrás felhasználó

szavazat
0

Ha már adott előrendelésre és szeretne alakítani postorder. Aztán meg kell emlékezni, hogy a BST érdekében mindig ad számokat növekvő order.Thus van mind Inorder valamint az előrendelési építeni egy fa.

előrendelés: 6, 2, 1, 4, 3, 7, 10, 9, 11

inorder: 1, 2, 3, 4, 6, 7, 9, 10, 11

És postorder: 1 3 4 2 9 11 10 7 6

Válaszolt 19/10/2017 09:06
a forrás felhasználó

szavazat
0

Itt előrendelhető bejárás egy bináris keresési fa adja a tömbben. Tehát az 1. elem előrendelhető tömb gyökere BST.We található a bal oldali részén BST és jobb oldalán BST.All az elem előrendelhető tömb kisebb, mint gyökér marad csomópont és minden eleme előre -rendelési tömb nagyobb a root lesz jobb csomópontot.

#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;
} 
Válaszolt 30/12/2017 04:04
a forrás felhasználó

szavazat
0

Mint tudjuk követni Előrendelési szülő, bal, jobb sorozat.

Annak érdekében, hogy építeni fa követnünk kell néhány alapvető steps-:

Kérdést állnak sorozat 6, 2,1,4,3,7,10,9,11

points-:

  1. Első számú sorozat lesz gyökér (szülő), azaz 6

2.Find a szám, amely nagyobb, mint 6, így ebben a sorozatban a 7. először nagyobb számban ebben a sorozatban, így jobb csomópont lesz kezdő, és innen balra ezt a számot (7) A balra részfákat.

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

3.same módon követik az alapvető szabályt a BST azaz balra, gyökér, jobb

a sorozat utáni sorrendben lesz L, R, N azaz 1,3,4,2,9,11,10,7,6

Válaszolt 03/02/2018 14:32
a forrás felhasználó

szavazat
0

Ezt a kódot a előrendelési postorder bejárás a python. Én létrehozunk egy fa olyan megtalálja bármilyen bejárás

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)
Válaszolt 29/07/2018 20:35
a forrás felhasználó

szavazat
0

Itt van a teljes 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())
Válaszolt 27/05/2019 09:17
a forrás felhasználó

szavazat
0

Mivel ez egy bináris keresési fa, a inorder bejárása lesz mindig a rendezett elemek. (Bal <root <jobbra)

így könnyen írni az in-order bejárás eredménye az első, amely a következő: 1,2,3,4,6,7,9,10,11

adott Előrendelés: 6, 2, 1, 4, 3, 7, 10, 9, 11

In-sorrendben: bal, gyökér, jobb Előrendelés: root, balra, jobbra utáni sorrendben: bal, jobb, gyökér

Most kaptunk a pre-order, hogy gyökér 6.

most, felhasználva a-rend és pre-order eredmények: 1. lépés:

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

2. lépés: a következő gyökér, használ-sorrendben bejárás, 2:

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

3. lépés: Hasonlóképpen, a következő gyökér 4:

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

4. lépés: a következő gyökér 3, de más elemet is megmaradt, hogy illeszkedjen a gyermek fa „3”. Figyelembe véve a következő root 7 most,

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

5. lépés: Next gyökér 10:

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

Így, akkor lehet építeni egy fa, és végül megtalálja a poszt-sorrendben bejárás, amely a következő: 1, 3, 4, 2, 9, 11, 10, 7, 6

Válaszolt 03/10/2019 13:57
a forrás felhasználó

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