Mengakses semua node pada kedalaman tertentu umumnya bermanfaat untuk keperluan lain, misalnya digunakan untuk menampilkan struktur tree.
Untuk mengakses node pada kedalaman tertentu mirip dengan proses traversal.
def getNodeAtDepth(self, depth, nodes=[]):
if depth==0:
nodes.append(self.data)
return nodes
if self.left:
self.left.getNodeAtDepth(depth-1, nodes)
else:
nodes.extend([None]*2**(depth-1))
if self.right:
self.right.getNodeAtDepth(depth-1, nodes)
else:
nodes.extend([None]*2**(depth-1))
return nodes
Fungsi memerlukan 2 parameter yaitu depth untuk kedalaman yang akan dicari dan nodes akan berisi list dari node-node pada kedalaman yang dimaksud.
Fungsi akan recursive hingga depth == 0, dan mengembalikan seluruh node pada kedalaman yang dimaksud.
Code dibawah bertujuan menambahkan None value pada list nodes jika node tidak ditemukan pada kedalaman tersebut.
nodes.extend([None]*2**(depth-1))
Jangan lupa tambahkan juga fungsi diatas pada class Tree agar mudah diakses melalui program.
def getNodeAtDepth(self, depth):
return self.root.getNodeAtDepth(depth)
Berikut code lengkap dari program tree.
class Node:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def search(self, target):
if self.data == target:
print("Node found")
return self
if self.left and self.data > target:
return self.left.search(target)
if self.right and self.data < target:
return self.right.search(target)
print("No Node Found")
def traversePreorder(self):
print(self.data)
if self.left:
self.left.traversePreorder()
if self.right:
self.right.traversePreorder()
def traverseInorder(self):
if self.left:
self.left.traverseInorder()
print(self.data)
if self.right:
self.right.traverseInorder()
def traversePostorder(self):
if self.left:
self.left.traversePostorder()
if self.right:
self.right.traversePostorder()
print(self.data)
def height(self, h=0):
leftHeight = self.left.height(h+1) if self.left else h
rightHeight = self.right.height(h+1) if self.right else h
return max(leftHeight, rightHeight)
def getNodeAtDepth(self, depth, nodes=[]):
if depth==0:
nodes.append(self.data)
return nodes
if self.left:
self.left.getNodeAtDepth(depth-1, nodes)
else:
nodes.extend([None]*2**(depth-1))
if self.right:
self.right.getNodeAtDepth(depth-1, nodes)
else:
nodes.extend([None]*2**(depth-1))
return nodes
class Tree:
def __init__(self, root, name=''):
self.root = root
self.name = name
def search(self, target):
return self.root.search(target)
def traversePreorder(self):
self.root.traversePreorder()
def traverseInorder(self):
self.root.traverseInorder()
def traversePostorder(self):
self.root.traversePostorder()
def height(self):
return self.root.height()
def getNodeAtDepth(self, depth):
return self.root.getNodeAtDepth(depth)
node = Node(55)
node.left = Node(25)
node.right = Node(70)
node.left.left = Node(15)
node.left.right = Node(35)
node.right.right = Node(75)
node.left.left.left = Node(5)
node.left.left.right = Node(20)
node.left.left.left.left = Node(1)
myTree = Tree(node, 'Basic BST')
print(myTree.getNodeAtDepth(3))
$ python tree.py
[5, 20, None, None, None, None, None, None]
Sesuai ekspektasi, pada kedalaman 3, tree hanya terdapat node dengan value 5 dan 20. Perhatikan nilai None menunjukan node tidak ditemukan pada level tersebut.
Menampilkan Tree Ke Console
Contoh penggunaan fungsi diatas pada fungsi menampilkan tree ke console.
def _nodeToChar(self, n, space):
if n is None:
return '_' + (' '*space)
space = space - len(str(n))+1
return str(n)+(' '*space)
def printTree(self, label=''):
print(self.name + ' ' + label)
height = self.root.height()
space = 3
width = int((2**height-1) * (space+1) +1)
offset = int((width-1)/2)
for depth in range(0, height+1):
if depth>0:
print(' '*(offset+1) + (' '*(space+2)).join(['/' + (' '*(space-2)) + '\\']*(2**(depth-1))))
row = self.root.getNodeAtDepth(depth, [])
print ((' '*offset)+ ''.join([self._nodeToChar(n,space) for n in row]))
space = offset + 1
offset = int(offset/2)-1
print ('')
Berikut isi lengkap program tree.
class Node:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def search(self, target):
if self.data == target:
print("Node found")
return self
if self.left and self.data > target:
return self.left.search(target)
if self.right and self.data < target:
return self.right.search(target)
print("No Node Found")
def traversePreorder(self):
print(self.data)
if self.left:
self.left.traversePreorder()
if self.right:
self.right.traversePreorder()
def traverseInorder(self):
if self.left:
self.left.traverseInorder()
print(self.data)
if self.right:
self.right.traverseInorder()
def traversePostorder(self):
if self.left:
self.left.traversePostorder()
if self.right:
self.right.traversePostorder()
print(self.data)
def height(self, h=0):
leftHeight = self.left.height(h+1) if self.left else h
rightHeight = self.right.height(h+1) if self.right else h
return max(leftHeight, rightHeight)
def getNodeAtDepth(self, depth, nodes=[]):
if depth==0:
nodes.append(self.data)
return nodes
if self.left:
self.left.getNodeAtDepth(depth-1, nodes)
else:
nodes.extend([None]*2**(depth-1))
if self.right:
self.right.getNodeAtDepth(depth-1, nodes)
else:
nodes.extend([None]*2**(depth-1))
return nodes
class Tree:
def __init__(self, root, name=''):
self.root = root
self.name = name
def search(self, target):
return self.root.search(target)
def traversePreorder(self):
self.root.traversePreorder()
def traverseInorder(self):
self.root.traverseInorder()
def traversePostorder(self):
self.root.traversePostorder()
def height(self):
return self.root.height()
def getNodeAtDepth(self, depth):
return self.root.getNodeAtDepth(depth)
def _nodeToChar(self, n, space):
if n is None:
return '_' + (' '*space)
space = space - len(str(n))+1
return str(n)+(' '*space)
def printTree(self, label=''):
print(self.name + ' ' + label)
height = self.root.height()
space = 3
width = int((2**height-1) * (space+1) +1)
offset = int((width-1)/2)
for depth in range(0, height+1):
if depth>0:
print(' '*(offset+1) + (' '*(space+2)).join(['/' + (' '*(space-2)) + '\\']*(2**(depth-1))))
row = self.root.getNodeAtDepth(depth, [])
print ((' '*offset)+ ''.join([self._nodeToChar(n,space) for n in row]))
space = offset + 1
offset = int(offset/2)-1
print ('')
node = Node(55)
node.left = Node(25)
node.right = Node(70)
node.left.left = Node(15)
node.left.right = Node(35)
node.right.right = Node(75)
node.left.left.left = Node(5)
node.left.left.right = Node(20)
node.left.left.left.left = Node(1)
myTree = Tree(node, 'Basic BST')
myTree.printTree()
$ python tree.py
Basic BST
55
/ \
25 70
/ \ / \
15 35 _ 75
/ \ / \ / \ / \
5 20 _ _ _ _ _ _
/ \ / \ / \ / \ / \ / \ / \ / \
1 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _