๐กย ํธ๋ฆฌ (Trees)
์ ์ (node) ๊ณผ ๊ฐ์ (edge) ์ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ์ ๋ฐฐ์น ํํ๋ฅผ ์ถ์ํํ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
- 2์ฐจ์์ ์๋ฃ ๊ตฌ์กฐ
- ์ ๋ณด๋ฅผ ์กฐ์งํํ๊ณ ๊ฒ์ํ๋๋ฐ ์ฉ์ดํ๊ฒ ์ด์ฉ ๊ฐ๋ฅ
๐ Check Point ๐
๐ญย LinkedList, Array - ๋ค๋ฅธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ง๋๋๋ฐ ๋ชจํฐ๋ธ๊ฐ ๋๋ ์๋ฃ๊ตฌ์กฐ (์ปดํจํฐ ์นํ์ )
๐ญย Stack, Queue, Deque - ์์คํ ๋ด๋ถ์ ์ธ ๊ตฌํ์์ ์ฌ์ฉํ๊ธฐ์ ์ฑ๋ฅ์ ์ถฉ์คํ ์๋ฃ๊ตฌ์กฐ (์ปดํจํฐ ์นํ์ )
๐ญย Trees - ์ฌ๋์ด ์ฌ์ฉํ๊ธฐ์ ํธ๋ฆฌํ๊ธฐ ์ํด์ ํ์ํ ์๋ฃ๊ตฌ์กฐ (์ฌ๋ ์นํ์ )
๐ย ์ฉ์ด ์ ๋ฆฌ
-
๋ฃจํธ (Root) ๋ ธ๋: ์ ์ผ ์์ ์์นํ ๋ ธ๋ - A
-
๋ฆฌํ (Leaf) ๋ ธ๋: ๋ ์ด์ ๊ฐ์ง์น ์๊ฐ ์๋ ๋งจ ๋ฐ์ ์๋ ๋ ธ๋ - H, I, J, F, G
-
๋ด๋ถ (Internal) ๋ ธ๋: ๋ฃจํธ๋ ๋ฆฌํ๋ ์๋ ์ค๊ฐ์ ์๋ ๋ ธ๋ - B, C, D, E
-
๋ถ๋ชจ (Parenet) ๋ ธ๋: ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค ์ฌ์ด์์ ๋ฃจํธ ๋ ธ๋ ์ชฝ์ ๊ฐ๊น์ด ๋ ธ๋ - ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋ D, H, I ์ ๊ด๊ณ์์ ๋ณด๋ฉด D ๊ฐ H, I ์ ๋ถ๋ชจ ๋ ธ๋์ด๋ค.
-
์์ (Child) ๋ ธ๋: ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค ์ฌ์ด์์ ๋ฆฌํ ๋ ธ๋ ์ชฝ์ ๊ฐ๊น์ด ๋ ธ๋ - D, H, I ๊ด๊ณ์์ H, I ๊ฐ D ์ ์์ ๋ ธ๋์ด๋ค.
-
slibing ๊ด๊ณ: ๊ฐ์ ๋ถ๋ชจ ์๋์ ๋ ธ๋๋ค ๋ผ๋ฆฌ์ ๊ด๊ณ - F, G ์ ๊ด๊ณ
-
์กฐ์ (Ancestor): ์์ ๋ ธ๋ ์ ์ฅ์์ ๋ถ๋ชจ์ ๋ถ๋ชจ โฆ ๋ก ์ฌ๋ผ๊ฐ๋ ๋ ธ๋๋ค - H, I ์ ์ฅ์์ A, B, D ๊ฐ ์กฐ์์ด๋ค.
-
ํ์ (Descendant): ๋ถ๋ชจ ๋ ธ๋ ์ ์ฅ์์ ์์์ ์์ โฆ ๋ก ๋ด๋ ค๊ฐ๋ ๋ ธ๋๋ค - A ์ ์ฅ์์ ๋๋จธ์ง๋ ธ๋๋ค์ด ํ์์ด๋ค.
-
๋ ธ๋์ ์์ค (Level): ๋ฃจํธ ๋ ธ๋๋ก๋ถํฐ ํด๋น ๋ ธ๋๊น์ง ๋๋ฌํ์ ๋ ๊ฑฐ์น๋ ๊ฐ์ ์ ๊ฐฏ์๋ก ์ ์ํ๋ค. - ๋ฃจํธ ๋ ธํธ: Level 0, ๋ฐ์ผ๋ก ๋ด๋ ค๊ฐ๋ฉด์ level ์ด 1 ์ฉ ์ฌ๋ผ๊ฐ๋ค.
-
ํธ๋ฆฌ์ ๋์ด (Height) = ์ต๋ ์์ค (level) + 1, ๊น์ด (depth) ๋ผ๊ณ ๋ ํ๋ค - ์ฌ๊ธฐ์์ ๋์ด๋ 4์ด๋ค.
-
๋ถ๋ถ ํธ๋ฆฌ (์๋ธํธ๋ฆฌ - Subtree): ํธ๋ฆฌ์์ ์ด๋ ํ ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ ์๋์ ์๋ ๊ฒ๋ค์ ์๋ก์ด ํธ๋ฆฌ๋ก ๋ณด๋ ๊ฒ - D ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ดค์ ๋ D, H, I ๋ฅผ ์๋ก์ด ๋ถ๋ถํธ๋ฆฌ๋ก ๋ณผ ์ ์๋ค.
-
๋ ธ๋์ ์ฐจ์ (Degree): ์์ (์๋ธํธ๋ฆฌ) ์ ์ - degree: 0 ์ธ ๊ฒ์ ๋ฆฌํ ๋ ธ๋์ด๋ค.
-
๊ฐ ๋ ธ๋๋ ์์ ๋ ธ๋๋ฅผ ์ฌ๋ฌ ๊ฐ ๊ฐ์ง ์ ์์ง๋ง, ๋ถ๋ชจ ๋ ธ๋๋ ๋จ ํ๋๋ง์ ๊ฐ์ง ์ ์๋ค.
๐ ์ฉ๋
- ํ์ผ์์คํ ๊ตฌ์กฐ์์ ์ฃผ๋ก ์ฌ์ฉ
- ๊ณ์ธต์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด์ผ ๋๋ ์ฌ๋ฌ๊ฐ์ง ์๋ฃ์์ ์ฌ์ฉ
๐ย ์ด์ง ํธ๋ฆฌ (Binary Tree)
๋ชจ๋ ๋ ธ๋์ ์ฐจ์๊ฐ 2 ์ดํ์ธ ํธ๋ฆฌ์ด๋ค.
- ๋น ํธ๋ฆฌ (empty tree)
- ๋ฃจํธ ๋ ธ๋ + ์ผ์ชฝ ์๋ธํธ๋ฆฌ + ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ (์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ๋ํ ์ด์งํธ๋ฆฌ์ด๋ค.)
๐ญย ์ฌ๊ท์ ์ผ๋ก ์ ์ํ ์ ์๋ค.
๐ ํฌํ ์ด์ง ํธ๋ฆฌ (Full Binary Tree)
๋ชจ๋ ๋ ๋ฒจ์์ ๋ ธ๋๋ค์ด ๋ชจ๋ ์ฑ์์ ธ ์๋ ์ด์ง ํธ๋ฆฌ์ด๋ค.
๐ญย ๋ฆฌํ ๋ ธ๋ ๋ค์ด ๊ฐ์ ๋์ด์ ์๋ ๊ฒ์ด ํน์ง์ด๋ค.
๐ญย ๋์ด๊ฐ $k$ ์ด๊ณ , ๋ ธ๋์ ๊ฐ์๊ฐ $2^k -1$ ์ธ ์ด์ง ํธ๋ฆฌ์ด๋ค.
๐ ์์ ์ด์ง ํธ๋ฆฌ (Complete Binary Tree)
๋ฆฌํ ๋ ธ๋๋ค์ด ์ผ์ชฝ๋ถํฐ ์ฑ์์ง๋ ๊ฒ์ด ํน์ง์ด๋ค. ๋์ด๊ฐ $k$ ์ธ ์์ ์ด์งํธ๋ฆฌ๋ level ์ด $k -2$ ๊น์ง๋ ๋ชจ๋ ๋ ธ๋๊ฐ 2 ๊ฐ์ ์์์ ๊ฐ์ง ํฌํ ์ด์ง ํธ๋ฆฌ์ด๊ณ , level ์ด $k-1$ ๋ถํฐ๋ ํฌํ ์ด์ง ํธ๋ฆฌ๊ฐ ์๋๋๋ผ๋ ์ผ์ชฝ๋ถํฐ ๋ ธ๋๊ฐ ์์ฐจ์ ์ผ๋ก ์ฑ์์ ธ ์๋ ์ด์ง ํธ๋ฆฌ์ ํํ๋ฅผ ๋๊ณ ์๋ค.
๐ญย ํธ๋ฆฌ๋ฅผ ์ด์ฉํ ๊ฒ์์์๋ ์์ ์ด์ง ํธ๋ฆฌ์ ๊ฐ๊น์ธ ์๋ก ๋์ ์ฑ๋ฅ์ ๋ด๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์นํ ๋๋ ์ต๋ํ ์์ ์ด์ง ํธ๋ฆฌ์ ๋ชจ์ต๊ณผ ๊ฐ๊น๊ฒ ๋ฐฐ์นํ๋ ๊ฒ์ด ์ข๋ค.
๐ ์ด์ง ํธ๋ฆฌ์ ์ถ์์ ์๋ฃ๊ตฌ์กฐ
์ฐ์ฐ์ ์ ์
size()
- ํ์ฌ ํธ๋ฆฌ์ ํฌํจ๋์ด ์๋ ๋ ธ๋์ ์๋ฅผ ๊ตฌํจdepth()
- ํ์ฌ ํธ๋ฆฌ์ ๊น์ด (๋๋ ๋์ด; height) ๋ฅผ ๊ตฌํจtraversal()
- ์ ํด์ง ์์๋๋ก ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํด์ ์ฒ๋ฆฌํ๋ ๊ฒ
์ด์ง ํธ๋ฆฌ์ ๊ตฌํ - ๋ ธ๋ (Node)
Node
- Data
- Left Child
- Right Child
class Node:
def __init__(self, item):
self.data = item
self.left = None
self.right = None
์ด์ง ํธ๋ฆฌ์ ๊ตฌํ - ํธ๋ฆฌ (Tree)
# ์ด์ง ํธ๋ฆฌ์์๋ ๋ฃจํธ ๋
ธ๋๋ง ์ฃผ์ด์ง๋ฉด ๊ฐ์ ์ ๋ฐ๋ผ ๋ด๋ ค๊ฐ๊ธฐ์ ๋ฃจํธ ๋
ธ๋๋ง ์ง์ ํด ์ค
class BinaryTree:
def __init__(self, r):
self.root = r
์ด์ง ํธ๋ฆฌ์ ๊ตฌํ - size()
# ์ฌ๊ท์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๊ฒ ๊ตฌํ ์ ์์!
# ์ ์ฒด ์ด์ง ํธ๋ฆฌ์ size() = left subtree ์ size() + right subtree ์ size() + 1 (์๊ธฐ ์์ )
class Node:
def size(self):
l = self.left.size() if self.left else 0
r = self.right.size() if self.right else 0
return l + r + 1
class BinaryTree:
def size(self):
if self.root:
return self.root.size()
else: # empty tree ์ผ ๋
return 0
์ด์ง ํธ๋ฆฌ์ ๊ตฌํ - depth()
# ์ฌ๊ท์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๊ฒ ๊ตฌํ ์ ์์!
# ์ ์ฒด ์ด์ง ํธ๋ฆฌ์ depth() = left subtree ์ depth() ์ right subtree ์ depth() ์ค ๋ ํฐ ๊ฒ + 1
class Node:
def depth(self):
...
class BinaryTree:
def depth(self):
if self.root:
return
class Node:
def __init__(self, item):
self.data = item
self.left = None
self.right = None
def size(self):
l = self.left.size() if self.left else 0
r = self.right.size() if self.right else 0
return l + r + 1
def depth(self):
l = self.left.depth() if self.left else 0
r = self.right.depth() if self.right else 0
return l + 1 if l >= r else r + 1
class BinaryTree:
def __init__(self, r):
self.root = r
def size(self):
if self.root:
return self.root.size()
else:
return 0
def depth(self):
if self.root:
return self.root.depth()
else:
return 0
๐ ์ด์ง ํธ๋ฆฌ์ ์ํ (Traversal)
- ๊น์ด ์ฐ์ ์ํ (Depth first traversal)
- ์ค์ ์ํ (In - order traversal)
- ์ ์ ์ํ (Pre - order traversal)
- ํ์ ์ํ (Post - order traversal)
- ๋๋น ์ฐ์ ์ํ (Breadth first traversal)
์ค์ ์ํ (In - order Traversal)
์ํ ์์:
- Left subtree
- ์๊ธฐ ์์
- Right subtree
์ผ์ชฝ ํ์ํธ๋ฆฌ๋ถํฐ ์์ํด์ ๋ฃจํธ๋ฅผ ๊ฑฐ์ณ ์ค๋ฅธ์ชฝ ํ์ํธ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ๋ ์ํ์ด๋ค.
์ ๊ทธ๋ฆผ์์ C, B, D ๋ฅผ ๋ฐฉ๋ฌธํ์ฌ ์ผ์ชฝ ํ์ํธ๋ฆฌ๋ฅผ ๊ฑฐ์ณ ๋ฃจํธ๋ ธ๋์ธ A๋ฅผ ๋ฐฉ๋ฌธ, ์ดํ์ ์ค๋ฅธ์ชฝ ํ์ํธ๋ฆฌ ์ค ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ F๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ์ดํ E, G ์์๋ก ๋ฐฉ๋ฌธ์ ํ๊ฒ ๋๋ค.
class Node:
def inorder(self):
traversal = [] # ๋ฆฌํดํ๋ ค๋ ๋ฐฉ๋ฌธ์์๊ฐ ๋ด๊ธธ ๋ฆฌ์คํธ
if self.left:
traversal += self.left.inorder()
traversal.append(self.data)
if self.right:
traversal += self.right.inorder()
return traversal
class BinaryTree:
def inorder(self):
if self.root:
return self.root.inorder()
else:
return []
์ ์ ์ํ (Pre - order Traversal)
์ํ ์์:
- ์๊ธฐ ์์
- Left subtree
- Right subtree
๋ฃจํธ ๋ ธ๋๋ถํฐ ์์ํ์ฌ ์ผ์ชฝ ํ์ํธ๋ฆฌ, ์ค๋ฅธ์ชฝ ํ์ํธ๋ฆฌ๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ฐฉ๋ฌธํ๋ ์ํ์ด๋ค. ์ ๊ทธ๋ฆผ์์ ๋ฃจํธ ๋ ธ๋์ธ A ๋ฅผ ์์์ผ๋ก B ๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ๋ค์ B ์ ์ผ์ชฝ ํ์ํธ๋ฆฌ์ธ C ๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ์ค๋ฅธ์ชฝ ํ์ํธ๋ฆฌ์ธ D๋ฅผ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ค. ์ด ํ์ ์์ฐจ์ ์ผ๋ก E, F, G ๋ฅผ ๋ฐฉ๋ฌธํ๋ค.
class Node:
def __init__(self, item):
self.data = item
self.left = None
self.right = None
def inorder(self):
traversal = []
if self.left:
traversal += self.left.inorder()
traversal.append(self.data)
if self.right:
traversal += self.right.inorder()
return traversal
def preorder(self):
traversal = []
traversal.append(self.data)
if self.left:
traversal += self.left.preorder() # left child ๊ฐ ์๋ ์ง ํ์ธํ๋ ค๋ ๊ฒ
if self.right:
traversal += self.right.preorder() # right child ๊ฐ ์๋ ์ง ํ์ธํ๋ ค๋ ๊ฒ
return traversal
class BinaryTree:
def __init__(self, r):
self.root = r
def inorder(self):
if self.root:
return self.root.inorder()
else:
return []
def preorder(self):
return self.root.preorder() if self.root else []
ํ์ ์ํ (Post - order Traversal)
์ํ ์์:
- Left subtree
- Right subtree
- ์๊ธฐ ์์
์ผ์ชฝ ํ์ํธ๋ฆฌ๋ถํฐ ์์ํ์ฌ ์ค๋ฅธ์ชฝ ํ์ํธ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ๋ง์ง๋ง์ผ๋ก ๋ฃจํธ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ์ํ์ด๋ค. ์ ๊ทธ๋ฆผ์์ ์ผ์ชฝ ํ์ํธ๋ฆฌ์ธ C ๋ฅผ ์ ์ผ ๋จผ์ ๋ฐฉ๋ฌธํ๊ณ C ์์์ ์ค๋ฅธ์ชฝ ํ์ํธ๋ฆฌ์ธ D๋ฅผ ๋ฐฉ๋ฌธ, ์ดํ B ๋ฅผ ๋ฐฉ๋ฌธํ๋ค.๊ทธ๋ฆฌ๊ณ ์ค๋ฅธ์ชฝ ํ์ํธ๋ฆฌ ์ค ์ ์ผ ์ผ์ชฝ ํ์ํธ๋ฆฌ์ธ F ๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ์์ฐจ์ ์ผ๋ก G, E, A ๋ฅผ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ค.
class Node:
def __init__(self, item):
self.data = item
self.left = None
self.right = None
def inorder(self):
traversal = []
if self.left:
traversal += self.left.inorder()
traversal.append(self.data)
if self.right:
traversal += self.right.inorder()
return traversal
def postorder(self):
traversal = []
if self.left:
traversal += self.left.postorder()
if self.right:
traversal += self.right.postorder()
traversal.append(self.data)
return traversal
class BinaryTree:
def __init__(self, r):
self.root = r
def inorder(self):
if self.root:
return self.root.inorder()
else:
return []
def postorder(self):
return self.root.postorder() if self.root else []
๋๋น ์ฐ์ ์ํ (Breadth First Traversal) (= ๋ ๋ฒจ ์์ ์ํ (Levelorder Traversal))
์ํ ์์:
- level ์ด ๋ฎ์ ๋ ธ๋๋ฅผ ์ฐ์ ์ผ๋ก ๋ฐฉ๋ฌธ
- ๊ฐ์ level ์ ๋ ธ๋๋ค ์ฌ์ด์์๋ ์ผ์ชฝ ๋ ธ๋์์ ์ค๋ฅธ์ชฝ ๋ ธ๋ ์์ผ๋ก ๋ฐฉ๋ฌธ
level ์ด ๊ฐ์ฅ ๋ฎ์ ๋ฃจํธ ๋ ธ๋๋ถํฐ ์์ํ์ฌ ๋ฆฌํ ๋ ธ๋๊น์ง ๋ด๋ ค๊ฐ๋ ์ํํ๋ ๋ฐฉ์์ด๋ค. ์ด ๋, ๊ฐ์ level ์์๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ ์์ผ๋ก ๋ฐฉ๋ฌธํ๋ค. ์ ๊ทธ๋ฆผ์์ ๋ฃจํธ ๋ ธ๋์ธ A ๋ฅผ ์์์ผ๋ก ๋ค์ level ์ธ B, C ์ค ์ผ์ชฝ๋ถํฐ B, C ์์ผ๋ก ๋ฐฉ๋ฌธํ๊ณ ์ด ํ ์์ฐจ์ ์ผ๋ก D, E, F, G, H, I, J, K, L ์ ๋ฐฉ๋ฌธํ๋ค.
๐ญย ์ฌ๊ท์ ๋ฐฉ๋ฒ์ด ์ ํฉํ์ง ์๊ณ , ๋์ค์ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ค์ ์์๋๋ก ๊ธฐ๋กํด ๋์ด์ผํ๊ธฐ ๋๋ฌธ์ ํ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๋๋น ์ฐ์ ์ํ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ
- ํ๊ฐ ๋น์ด์๋ค๋ฉด ๋ฃจํธ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๋ค.
- ํ์์ ๊บผ๋ธ ํ ํด๋น ๋ ธ๋ ๋ฐฉ๋ฌธํ๋ค.
- ํด๋น ๋ ธ๋์ ์ผ์ชฝ ์์ ๋ ธ๋๊ฐ ์๋ค๋ฉด ํ์ ์ฝ์ ํ๋ค.
- ํด๋น ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๊ฐ ์๋ค๋ฉด ํ์ ์ฝ์ ํ๋ค.
- ๋ค ํ์ธํ๋ค๋ฉด ํ์ ์๋ ๊ฐ์ ๋นผ๋ธ๋ค.
- ์์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น ํ ํ๊ฐ ๋น์ด์๋ค๋ฉด ์ข ๋ฃํ๋ค.
๋๋น ์ฐ์ ์ํ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
class BinaryTree:
def bft(self):
1. (์ด๊ธฐํ) traversal <- ๋น ๋ฆฌ์คํธ, q <- ๋นํ
2. ๋น ํธ๋ฆฌ๊ฐ ์๋๋ฉด, root node๋ฅผ ํ์ ์ถ๊ฐ (enqueue)
3. q ๊ฐ ๋น์ด ์์ง ์์ ๋์ ์งํ
3.1 node <- q ์์ ์์๋ฅผ ์ถ์ถ (dequeue)
3.2 node ๋ฅผ ๋ฐฉ๋ฌธ (append)
3.3 node ์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์์ (์์ผ๋ฉด) ๋ค์ q ์ ์ถ๊ฐ
4. q๊ฐ ๋น ํ๊ฐ ๋๋ฉด ๋ชจ๋ ๋
ธ๋ ๋ฐฉ๋ฌธ ์๋ฃ
class ArrayQueue:
def __init__(self):
self.data = []
def size(self):
return len(self.data)
def isEmpty(self):
return self.size() == 0
def enqueue(self, item):
self.data.append(item)
def dequeue(self):
return self.data.pop(0)
def peek(self):
return self.data[0]
class Node:
def __init__(self, item):
self.data = item
self.left = None
self.right = None
class BinaryTree:
def __init__(self, r):
self.root = r
def bft(self):
traversal = []
Queue = ArrayQueue()
if self.root:
Queue.enqueue(self.root)
while not Queue.isEmpty():
q = Queue.dequeue()
traversal.append(q.data)
if q.left:
Queue.enqueue(q.left)
if q.right:
Queue.enqueue(q.right)
return traversal