λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

자료ꡬ쑰 및 μ‹€μŠ΅

자료ꡬ쑰 및 μ‹€μŠ΅ - [8] 트리 Tree (파이썬으둜 μ„ μœ„μˆœνšŒ, ν›„μœ„μˆœνšŒ κ΅¬ν˜„) (2)

μ„ μœ„μˆœνšŒ

μ„ μœ„μˆœνšŒλŠ” λ…Έλ“œλ₯Ό 자기 μžμ‹λ…Έλ“œλ³΄λ‹€ μ•žμ„œμ„œ λ°©λ¬Έν•˜λŠ” 방법이닀.

μ΄λŠ” μž¬κ·€μ μœΌλ‘œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

μ„ μœ„μˆœνšŒ μ˜μ‚¬μ½”λ“œ

ν›„μœ„μˆœνšŒ

μ„ μœ„μˆœνšŒλŠ” λ…Έλ“œλ₯Ό 자기 μžμ‹λ…Έλ“œλ³΄λ‹€ λ‚˜μ€‘μ— λ°©λ¬Έν•˜λŠ” 방법이닀.

μ΄λ˜ν•œ μž¬κ·€μ μœΌλ‘œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

ν›„μœ„μˆœνšŒ μ˜μ‚¬μ½”λ“œ

 

두가지 방법을 κ΅¬ν˜„ν•˜λŠ”λ° 차이점은 λ…Έλ“œλ₯Ό λ°©λ¬Έν•˜λŠ” 타이밍에 μžˆλ‹€. κ°„λ‹¨ν•˜κ²Œ μˆœμ„œλ§Œ λ°”κΏ”μ£Όλ©΄ κ΅¬ν˜„ν•  수 μžˆλ‹€.

μ•„λž˜λŠ” 전체적인 트리 ADT의 λ©”μ„œλ“œμ— μ„ μœ„μˆœνšŒ, ν›„μœ„μˆœνšŒλ₯Ό 좔가해놓은 것이닀. 

class Node:
  def __init__(self,data,L=None,R=None,parent=None,num=None):
    self.data = data
    self.L = L
    self.R = R
    self.parent = parent
    self.num = num

class tree:
  def __init__(self):
    self.root = None
    self.n=0
  
  def root(self):
    return self.root
  
  def element(self,v):
    return v.data

  def isRoot(self,v):
    return v==self.root

  def parent(self,v):
    return v.parant
  
  def leftchild(self,v):
    return v.L
  
  def rightchild(self,v):
    return v.R
  
  def sibling(self,v):
    p = v.parent
    if (p.L == v):
      return p.R
    else:
      return p.L
  
  def isInternal(self,v):
    return (v.L != None) and (v.R != None)
  
  def isExternal(self,v):
    return (v.L == None) and (v.R == None)
  
  def setElement(self,v,e):
    v.data = e
    return e
  
  def swapElements(self,v,w):
    tmp = v.data
    v.data = w.data
    w.data = tmp
    print(f"v.data : {tmp} => {v.data} / w.data : {v.data} => {w.data} ")

  def preorder(self,v): # μ„ μœ„μˆœνšŒ
    print(v.data)
    if self.leftchild(v) != None:
      self.preorder(self.leftchild(v))
    if self.rightchild(v) != None:
      self.preorder(self.rightchild(v))

  def postorder(self,v): # ν›„μœ„ 순회
    if self.leftchild(v) != None:
      self.postorder(self.leftchild(v))
    if self.rightchild(v) != None:
      self.postorder(self.rightchild(v))
    print(v.data)

  
  def addNode(self,v,data,location,num):
    if location =='L':
      v.L = Node(data,None,None,v,num)
      self.n+=1
    elif location == 'root':
      self.root = Node('Root',None,None,None,num)
      self.n+=1
    else:
      v.R = Node(data,None,None,v,num)
      self.n+=1
728x90