๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์‹ค์Šต

์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์‹ค์Šต - [8] ํŠธ๋ฆฌ Tree ์‹ค์Šต๋ฌธ์ œ(ํŒŒ์ด์ฌ์œผ๋กœ ์„ ์œ„์ˆœํšŒ, ํ›„์œ„์ˆœํšŒ ๊ตฌํ˜„) (3)

์œ„ ํŠธ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๊ณ , ์ฃผ์–ด์ง„ ๋…ธ๋“œ์— ๋Œ€ํ•ด ์ž์‹ ๊ณผ ์™ผ์ชฝ ์ž์‹, ์šฐ์ธก ์ž์‹์˜ ์šฉ๋Ÿ‰์„ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•˜์‹œ์˜ค.


โ€ป ์ฐธ๊ณ ์‚ฌํ•ญ: ์‹ค์Šต ๋ฐ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ์œ„ํ•ด ๋ณธ ๋ฌธ์ œ์—์„œ๋Š” ๊ณ ์ •๋œ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ ์œผ๋กœ ์‚ฝ์ž…, ์‚ญ์ œ ๊ฐ€๋Šฅํ•œ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•จ

 

์ถœ๋ ฅ 

โ—ฆ ์ž์‹ ๋ฐ ๋…ธ๋“œ ์กด์žฌ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ถœ๋ ฅ ๋‚ด์šฉ์ด ๋‹ฌ๋ผ์ง
  - ํ•œ์ชฝ ์ž์‹๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, ์ž์‹ ๊ณผ ํ•ด๋‹น ์ž์‹ ๋…ธ๋“œ์˜ ์šฉ๋Ÿ‰ 2๊ฐœ ๊ฐ’๋งŒ ์ถœ๋ ฅ
  - ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ์ž์‹ ์˜ ์šฉ๋Ÿ‰ 1๊ฐœ ๊ฐ’๋งŒ ์ถœ๋ ฅ
  - ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋…ธ๋“œ๋ฒˆํ˜ธ๊ฐ€ ์ž…๋ ฅ๋˜๋Š” ๊ฒฝ์šฐ –1์„ ์ถœ๋ ฅ

 

์œ„ ๋ฌธ์ œ๋Š” ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ํ•ด๋‹นํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ๊ณ , ์กฐ๊ฑด์— ๋งž๊ฒŒ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

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,number=None): # ์„ ์œ„์ˆœํšŒ
    print(v.data)
    if self.leftchild(v) != None:
      self.preorder(self.leftchild(v),number)
    if self.rightchild(v) != None:
      self.preorder(self.rightchild(v),number)


  def postorder(self,v,number=None): # ํ›„์œ„ ์ˆœํšŒ
    if self.leftchild(v) != None:
      self.postorder(self.leftchild(v),number)
    if self.rightchild(v) != None:
      self.postorder(self.rightchild(v),number)
    print(v.data)


  
  def printSLR1(self,v,number): # ํ›„์œ„ ์ˆœํšŒ
    if number > self.n:
      print(-1)
    else:
      if self.leftchild(v) != None:
        self.printSLR1(self.leftchild(v),number)
      if self.rightchild(v) != None:
        self.printSLR1(self.rightchild(v),number)
      if v.num==number:
        target = v.data
        print(target,end=' ')
        if v.L != None:
          print(v.L.data,end=' ')
        if v.R != None:
          print(v.R.data)
        
  
  def printSLR2(self,v,number): # ์„ ์œ„์ˆœํšŒ
    if number > self.n:
      print(-1)
    else:
      if v.num==number:
        target = v.data
        print(target,end=' ')
        if v.L != None:
          print(v.L.data,end=' ')
        if v.R != None:
          print(v.R.data)
      if self.leftchild(v) != None:
        self.printSLR2(self.leftchild(v),number)
      if self.rightchild(v) != None:
        self.printSLR2(self.rightchild(v),number)
    

  
  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

ํ›„์œ„์ˆœํšŒ ๋ฐฉ์‹์œผ๋กœ ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ ํ•ด๋‹นํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š” printSLR1๊ณผ

์„ ์œ„์ˆœํšŒ ๋ฐฉ์‹์œผ๋กœ ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ ํ•ด๋‹นํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š” printSLR2๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.

 

์ •์ƒ ์ž‘๋™์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋ฆฌ๋ฅผ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑํ•ด๋ณด์ž

F = tree()
F.addNode(None,'20','root',1)
root = F.root
F.addNode(root,'30','L',2)
F.addNode(root,'50','R',3)
F2 = root.L
F3 = root.R
F.addNode(F2,'70','L',4)
F.addNode(F2,'90','R',5)
F.addNode(F3,'120','R',6)
F6 = F3.R
F.addNode(F6,'130','L',7)
F.addNode(F6,'80','R',8)

 

ํ›„์œ„์ˆœํšŒ์™€ ์„ ์œ„์ˆœํšŒ๋ฐฉ์‹์˜ ์ž‘๋™์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

>>> F.postorder(root)
70
90
30
130
80
120
50
Root

>>> F.preorder(root)
Root
30
70
90
50
120
130
80

 

๋งˆ์ง€๋ง‰์œผ๋กœ ์กฐ๊ฑด์— ๋งž๊ฒŒ ๊ตฌ์„ฑํ•œ printSLRํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด๋ณด์ž.

>>> F.printSLR1(root,10)
-1

>>> F.printSLR1(root,2)
30 70 90

>>> F.printSLR2(root,10)
-1

>>> F.printSLR2(root,5)
90

์‹คํ–‰์ด ์ž˜ ๋˜๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

728x90