Pre-order to post-order traversal

后端 未结 11 1454
挽巷
挽巷 2020-12-23 21:56

If the pre-order traversal of a binary search tree is 6, 2, 1, 4, 3, 7, 10, 9, 11, how to get the post-order traversal?

相关标签:
11条回答
  • 2020-12-23 22:38

    I know this is old but there is a better solution.

    We don't have to reconstruct a BST to get the post-order from the pre-order.

    Here is a simple python code that does it recursively:

    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]
    

    Explanation:

    We know that we are in pre-order. This means that the root is at the index 0 of the list of the values in the BST. And we know that the elements following the root are:

    • first: the elements less than the root, which belong to the left subtree of the root
    • second: the elements greater than the root, which belong to the right subtree of the root

    We then just call recursively the function on both subtrees (which still are in pre-order) and then chain left + right + root (which is the post-order).

    0 讨论(0)
  • 2020-12-23 22:48

    Here is full code )

    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())
    
    0 讨论(0)
  • 2020-12-23 22:52

    This is the code of preorder to postorder traversal in python. I am constructing a tree so you can find any type of 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)
    
    0 讨论(0)
  • 2020-12-23 22:53

    Based on Ondrej Tucny's answer. Valid for BST only
    example:

         20  
        /  \  
       10  30  
       /\    \  
      6  15   35  
    

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

    For a BST, In Preorder traversal; first element of array is 20. This is the root of our tree. All numbers in array which are lesser than 20 form its left subtree and greater numbers form right subtree.

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

    Please correct me if there is any mistake.

    0 讨论(0)
  • 2020-12-23 22:53

    As we Know preOrder follow parent, left, right series.

    In order to construct tree we need to follow few basic steps-:

    your question consist of series 6, 2,1,4,3,7,10,9,11

    points-:

    1. First number of series will be root(parent) i.e 6

    2.Find the number which is greater than 6 so in this series 7 is first greater number in this series so right node will be starting from here and left to this number(7) is your left subtrees.

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

    3.same way follow the basic rule of BST i.e left,root,right

    the series of post order will be L, R, N i.e. 1,3,4,2,9,11,10,7,6

    0 讨论(0)
提交回复
热议问题