Given a BST and its root, print all sequences of nodes which give rise to the same bst

前端 未结 8 975
半阙折子戏
半阙折子戏 2020-12-13 05:49

Given a BST, find all sequences of nodes starting from root that will essentially give the same binary search tree.

Given a bst, say

  3
 /  \\
1             


        
8条回答
  •  盖世英雄少女心
    2020-12-13 06:13

    well here is my python code which does producing all sequences of elements/numbers for same BST. for the logic i referred to the book cracking the coding interview by Gayle Laakmann Mcdowell

    from binarytree import  Node, bst, pprint
    
    def wavelist_list(first, second, wave, prefix):
        if first:
           fl = len(first)
        else:
           fl = 0
    
        if second:       
            sl = len(second)
        else:
           sl = 0   
        if fl == 0 or sl == 0:
           tmp = list()
           tmp.extend(prefix)
           if first:
              tmp.extend(first)
           if second:   
              tmp.extend(second)
           wave.append(tmp)
           return
    
        if fl:
            fitem = first.pop(0)
            prefix.append(fitem)
            wavelist_list(first, second, wave, prefix)
            prefix.pop()
            first.insert(0, fitem)
    
        if sl:
            fitem = second.pop(0)
            prefix.append(fitem)
            wavelist_list(first, second, wave, prefix)
            prefix.pop()
            second.insert(0, fitem)        
    
    
    def allsequences(root):
        result = list()
        if root == None:
           return result
    
        prefix = list()
        prefix.append(root.value)
    
        leftseq = allsequences(root.left)
        rightseq = allsequences(root.right)
        lseq = len(leftseq)
        rseq = len(rightseq)
    
        if lseq and rseq:
           for i in range(lseq):
              for j in range(rseq):
                wave = list()
                wavelist_list(leftseq[i], rightseq[j], wave, prefix)
                for k in range(len(wave)):
                    result.append(wave[k])
    
        elif lseq:
          for i in range(lseq):
            wave = list()
            wavelist_list(leftseq[i], None, wave, prefix)
            for k in range(len(wave)):
                result.append(wave[k])
    
        elif rseq:
          for j in range(rseq):
            wave = list()
            wavelist_list(None, rightseq[j], wave, prefix)
            for k in range(len(wave)):
                result.append(wave[k])
       else:
           result.append(prefix) 
    
       return result
    
    
    
    if __name__=="__main__":
        n = int(input("what is height of tree?"))
        my_bst = bst(n)
        pprint(my_bst)
    
        seq = allsequences(my_bst)
        print("All sequences")
        for i in range(len(seq)):
            print("set %d = " %(i+1), end="")
            print(seq[i])
    
     example output:
     what is height of tree?3
    
           ___12      
          /     \     
      __ 6       13   
     /   \        \  
     0     11       14
      \               
       2              
    
    
      All sequences
      set 1 = [12, 6, 0, 2, 11, 13, 14]
      set 2 = [12, 6, 0, 2, 13, 11, 14]
      set 3 = [12, 6, 0, 2, 13, 14, 11]
      set 4 = [12, 6, 0, 13, 2, 11, 14]
      set 5 = [12, 6, 0, 13, 2, 14, 11]
      set 6 = [12, 6, 0, 13, 14, 2, 11]
      set 7 = [12, 6, 13, 0, 2, 11, 14]
      set 8 = [12, 6, 13, 0, 2, 14, 11]
      set 9 = [12, 6, 13, 0, 14, 2, 11]
      set 10 = [12, 6, 13, 14, 0, 2, 11]
      set 11 = [12, 13, 6, 0, 2, 11, 14]
      set 12 = [12, 13, 6, 0, 2, 14, 11]
      set 13 = [12, 13, 6, 0, 14, 2, 11]
      set 14 = [12, 13, 6, 14, 0, 2, 11]
      set 15 = [12, 13, 14, 6, 0, 2, 11]
      set 16 = [12, 6, 0, 11, 2, 13, 14]
      set 17 = [12, 6, 0, 11, 13, 2, 14]
      set 18 = [12, 6, 0, 11, 13, 14, 2]
      set 19 = [12, 6, 0, 13, 11, 2, 14]
      set 20 = [12, 6, 0, 13, 11, 14, 2]
      set 21 = [12, 6, 0, 13, 14, 11, 2]
      set 22 = [12, 6, 13, 0, 11, 2, 14]
      set 23 = [12, 6, 13, 0, 11, 14, 2]
      set 24 = [12, 6, 13, 0, 14, 11, 2]
      set 25 = [12, 6, 13, 14, 0, 11, 2]
      set 26 = [12, 13, 6, 0, 11, 2, 14]
      set 27 = [12, 13, 6, 0, 11, 14, 2]
      set 28 = [12, 13, 6, 0, 14, 11, 2]
      set 29 = [12, 13, 6, 14, 0, 11, 2]
      set 30 = [12, 13, 14, 6, 0, 11, 2]
      set 31 = [12, 6, 11, 0, 2, 13, 14]
      set 32 = [12, 6, 11, 0, 13, 2, 14]
      set 33 = [12, 6, 11, 0, 13, 14, 2]
      set 34 = [12, 6, 11, 13, 0, 2, 14]
      set 35 = [12, 6, 11, 13, 0, 14, 2]
      set 36 = [12, 6, 11, 13, 14, 0, 2]
      set 37 = [12, 6, 13, 11, 0, 2, 14]
      set 38 = [12, 6, 13, 11, 0, 14, 2]
      set 39 = [12, 6, 13, 11, 14, 0, 2]
      set 40 = [12, 6, 13, 14, 11, 0, 2]
      set 41 = [12, 13, 6, 11, 0, 2, 14]
      set 42 = [12, 13, 6, 11, 0, 14, 2]
      set 43 = [12, 13, 6, 11, 14, 0, 2]
      set 44 = [12, 13, 6, 14, 11, 0, 2]
      set 45 = [12, 13, 14, 6, 11, 0, 2]
    

提交回复
热议问题