Binary tree structure definition and traversal method of Python data structure and algorithm

  • 2020-06-15 09:45:05
  • OfStack

An example of Python data structure and algorithm is presented in this paper. To share for your reference, specific as follows:

First order traversal, in order traversal, after order traversal, the difference lies in the position of the three core statements

Hierarchical traversal adopts the traversal operation of the queue to access the root for the first time. The left child of the root is accessed, and then the child of the root is accessed, and then the node of the same layer is accessed from the left to the right in the next layer


#  The first sequence traversal 
#  Visit node, traverse left subtree, if left subtree is empty, traverse right subtree, 
#  If the right subtree is empty, go up to 1 Three nodes that can go to the right, and continue the process 
preorder(t):
  if t:
    print t.value
    preorder t.L
    preorder t.R
#  In the sequence traversal 
#  Starting at the root, 1 Go straight to the bottom left, until no node can walk, stop, access the node 
#  Then it goes to the lower right to the node, and then to the lower left: if the node has no right children, it goes up to the parent 
inorder(t):
  inorder(t.L)
  print t.value
  inorder(t.R)
#  After the sequence traversal 
inorder(t):
  inorder(t.L)
  inorder(t.R)
  print t.value
# 2 Cross tree node type 
class BTNode:
  def __init__(self,value,lft=None,rgt=None):
    self.value = value
    self.lft = lft     #  Node left branch  BTNode
    self.rgt = rgt     #  Node right branch  BTNode

For convenience, define 1 some printing operations


class BinTree():
  def __init__(self):
    self.root = None  #  create 1 empty 2 tree 
  def isEmpty(self):   #  judge 2 Whether the tree is empty 
    if self.root is None: return True
    else: return False
  def makeBT(self,bt,L=None,R=None):    #  Created from the current node 2 tree 
    bt.lft = L
    bt.rgt = R
  def returnBTdict(self):       #  return 2 The dictionary pattern of the cross tree 
    if self.isEmpty(): 
      return None
    def rec(bt=None,R=True):
      if R==True:
        bt = self.root
        return {'root':{'value':bt.value,"L":rec(bt.lft,False),
                        "R":rec(bt.rgt,False)} }
      else:
        if bt==None:
          return None
        else:
          return {"value":bt.value,
              "L":rec(bt.lft,False) if bt.lft != None else None,
              "R":rec(bt.rgt,False) if bt.rgt != None else None}
      return None
    return rec()
  def __repr__(self):       #  will 2 The cross-tree structure is printed as a dictionary structure 
    return str(self.returnBTdict())

Below are the various traversal methods added to the class of the tree


def printT_VLR(self,bt=None,rec_count = 0):   #  The output 2 Cross tree structure (sequential traversal first) 
    # rec_count  Used to calculate the depth of recursion   To output the last line break 
    """
    #  The first sequence traversal 
    #  Visit node, traverse left subtree, if left subtree is empty, traverse right subtree, 
    #  If the right subtree is empty, go up to 1 Three nodes that can go to the right, and continue the process 
    preorder(t):
      if t:
        print t.value
        preorder t.L
        preorder t.R
    """
    if bt==None: 
      bt = self.root
      print bt.value,
    btL, btR = bt.lft, bt.rgt
    if btL != None:
      print btL.value,;  rec_count += 1;   self.printT_VLR(btL,rec_count);   rec_count -= 1
    if btR != None:
      print btR.value,;  rec_count += 1;   self.printT_VLR(btR,rec_count);   rec_count -= 1
    if rec_count == 0:
      print "\n"
def printT_LVR(self,bt=None):
    """
    #  In the sequence traversal 
    #  Starting at the root, 1 Go straight to the bottom left, until no node can walk, stop, access the node 
    #  Then it goes to the lower right to the node, and then to the lower left: if the node has no right children, it goes up to the parent 
    inorder(t):
      inorder(t.L)
      print t.value
      inorder(t.R)
    """
    if bt==None:
      bt = self.root
    btL, btR = bt.lft, bt.rgt
    if btL != None:
      self.printT_LVR(btL)
    print bt.value,
    if btR != None:
      self.printT_LVR(btR)
def printT_LRV(self,bt=None):
    """
    #  After the sequence traversal 
    inorder(t):
      inorder(t.L)
      inorder(t.R)
      print t.value
    """
    if bt==None:
      bt = self.root
    btL, btR = bt.lft, bt.rgt
    if btL != None:
      self.printT_LRV(btL)
    if btR != None:
      self.printT_LRV(btR)
    print bt.value,
def printT_levelorder(self):
    """
     Sequence traversal   Queue traversal operation is adopted 
     The first 1 The second visit to the root, the left child in the visit to the root, the next visit to the root has the child, and then the next 1 layer 
     From left to right 11 Access nodes of the same layer 
    """
    btdict = self.returnBTdict()
    q = []
    q.append(btdict['root'])
    while q:
      tn = q.pop(0)  #  Pop out of the queue 1 A node ( Is also 1 A dictionary )
      print tn["value"],
      if tn["L"]!=None:
        q.append(tn["L"])
      if tn["R"]!=None:
        q.append(tn["R"])

Test printing effect


def test():
  bt = BinTree()
#   btns = [BTNode(v) for v in "+*E*D/CAB"]   #  The sequence of input 
#   bt.root = btns[0]
#   bt.makeBT(btns[0], L=btns[1], R=btns[2])
#   bt.makeBT(btns[1], L=btns[3], R=btns[4])
#   bt.makeBT(btns[3], L=btns[5], R=btns[6])
#   bt.makeBT(btns[5], L=btns[7], R=btns[8])
  btns = [BTNode(v) for v in [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]]
  bt.root = btns[0]
  bt.makeBT(btns[0], L=btns[1], R=btns[2])
  bt.makeBT(btns[1], L=btns[3], R=btns[4])
  bt.makeBT(btns[2], L=btns[5], R=btns[6])
  bt.makeBT(btns[3], L=btns[7], R=btns[8])
  bt.makeBT(btns[4], L=btns[9], R=btns[10])
  bt.makeBT(btns[5], L=btns[11], R=btns[12])
  bt.makeBT(btns[6], L=btns[13], R=btns[14])

Output:

{'root': {'R': {'R': {'R': {'R': None, 'L': None, 'value': 15}, 'L': {'R': None, 'L': None, 'value': 14}, 'value': 7}, 'L': {'R': {'R': None, 'L': None, 'value': 13}, 'L': {'R': None, 'L': None, 'value': 12}, 'value': 6}, 'value': 3}, 'L': {'R': {'R': {'R': None, 'L': None, 'value': 11}, 'L': {'R': None, 'L': None, 'value': 10}, 'value': 5}, 'L': {'R': {'R': None, 'L': None, 'value': 9}, 'L': {'R': None, 'L': None, 'value': 8}, 'value': 4}, 'value': 2}, 'value': 1}}

For more information about Python, please refer to Python Data Structure and Algorithm Tutorial, Python Encryption and Decryption Algorithm and Skills Summary, Python Coding skills Summary, Python Function Use Skills Summary, Python String Manipulation Skills Summary and Python Introduction and Advanced Classic Tutorial.

I hope this article has been helpful in Python programming.


Related articles: