์ ํธ๋ฆฌ๋ฅผ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด์ ๊ตฌํํ๊ณ , ์ฃผ์ด์ง ๋ ธ๋์ ๋ํด ์์ ๊ณผ ์ผ์ชฝ ์์, ์ฐ์ธก ์์์ ์ฉ๋์ ์์๋๋ก ์ถ๋ ฅํ์์ค.
โป ์ฐธ๊ณ ์ฌํญ: ์ค์ต ๋ฐ ํ
์คํธ ์ฉ์ด์ฑ์ ์ํด ๋ณธ ๋ฌธ์ ์์๋ ๊ณ ์ ๋ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ๋์ ์ผ๋ก ์ฝ์
, ์ญ์ ๊ฐ๋ฅํ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํจ
์ถ๋ ฅ
โฆ ์์ ๋ฐ ๋
ธ๋ ์กด์ฌ ์ฌ๋ถ์ ๋ฐ๋ผ ์ถ๋ ฅ ๋ด์ฉ์ด ๋ฌ๋ผ์ง
- ํ์ชฝ ์์๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ, ์์ ๊ณผ ํด๋น ์์ ๋
ธ๋์ ์ฉ๋ 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
์คํ์ด ์ ๋๋๊ฒ์ ํ์ธํ ์ ์๋ค.