Skip to content

Commit fe63ab2

Browse files
committed
Add Morris Inorder Traversal algorithm with tests
1 parent 08d8c6b commit fe63ab2

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

Trees/MorrisTraversal.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
class Node {
2+
constructor(data) {
3+
this.data = data
4+
this.left = null
5+
this.right = null
6+
}
7+
}
8+
9+
class BinaryTree {
10+
constructor() {
11+
this.root = null
12+
}
13+
14+
morrisTraversal() {
15+
const traversal = []
16+
let current = this.root
17+
18+
while (current !== null) {
19+
if (current.left === null) {
20+
traversal.push(current.data)
21+
current = current.right
22+
} else {
23+
let predecessor = current.left
24+
while (predecessor.right !== null && predecessor.right !== current) {
25+
predecessor = predecessor.right
26+
}
27+
28+
if (predecessor.right === null) {
29+
predecessor.right = current
30+
current = current.left
31+
} else {
32+
predecessor.right = null
33+
traversal.push(current.data)
34+
current = current.right
35+
}
36+
}
37+
}
38+
39+
return traversal
40+
}
41+
}
42+
43+
module.exports = { BinaryTree, Node }

Trees/test/MorrisTraversal.test.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
const { BinaryTree, Node } = require('../MorrisTraversal')
2+
3+
describe('Morris Inorder Tree Traversal', () => {
4+
const binaryTree = new BinaryTree()
5+
6+
const root = new Node(7)
7+
root.left = new Node(5)
8+
root.right = new Node(8)
9+
root.left.left = new Node(3)
10+
root.left.right = new Node(6)
11+
root.left.right.right = new Node(9)
12+
binaryTree.root = root
13+
14+
it('Binary tree - Empty case', () => {
15+
const emptyTree = new BinaryTree()
16+
expect(emptyTree.morrisTraversal()).toStrictEqual([])
17+
})
18+
19+
it('Binary tree - Morris inorder traversal', () => {
20+
const traversal = binaryTree.morrisTraversal()
21+
expect(traversal).toStrictEqual([3, 5, 6, 9, 7, 8])
22+
})
23+
})

0 commit comments

Comments
 (0)