Skip to content

Commit 36776f2

Browse files
author
Saad Arqam
committed
feat: add Morris Inorder Traversal algorithm in JavaScript issue #1806
1 parent 08d8c6b commit 36776f2

File tree

2 files changed

+116
-0
lines changed

2 files changed

+116
-0
lines changed

Trees/MorrisTraversal.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Morris Inorder Traversal
2+
// Reference: https://www.geeksforgeeks.org/dsa/inorder-tree-traversal-without-recursion-and-without-stack/
3+
4+
/*
5+
* Author: Saad Arqam
6+
* Morris Inorder Traversal Algorithm implementation in JavaScript
7+
*
8+
* Morris Traversal is a tree traversal algorithm that allows
9+
* inorder traversal without using recursion or a stack.
10+
* It achieves O(1) extra space by temporarily modifying
11+
* the tree structure (creating and removing "threads").
12+
*
13+
* Reference:
14+
* https://en.wikipedia.org/wiki/Threaded_binary_tree#Morris_traversal
15+
*/
16+
17+
18+
19+
// Node class
20+
export class Node {
21+
constructor(val) {
22+
this.val = val
23+
this.left = null
24+
this.right = null
25+
}
26+
}
27+
28+
// Morris Inorder Traversal function
29+
export function morrisTraversal(node) {
30+
const result = []
31+
let curr = node
32+
33+
while (curr !== null) {
34+
if (curr.left === null) {
35+
result.push(curr.val)
36+
curr = curr.right
37+
} else {
38+
let predecessor = curr.left
39+
while (predecessor.right !== null && predecessor.right !== curr) {
40+
predecessor = predecessor.right
41+
}
42+
if (predecessor.right === null) {
43+
predecessor.right = curr
44+
curr = curr.left
45+
} else {
46+
predecessor.right = null
47+
result.push(curr.val)
48+
curr = curr.right
49+
}
50+
}
51+
}
52+
53+
return result
54+
}
55+
56+
57+
58+
59+
// Example Tree:
60+
// 7
61+
// / \
62+
// 5 8
63+
// / \
64+
// 3 6
65+
// \
66+
// 9
67+
//
68+
// Morris inorder traversal: [3, 5, 6, 9, 7, 8]
69+
70+

Trees/MorrisTraversal.test.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { describe, it, expect } from 'vitest'
2+
import { Node, morrisTraversal } from './MorrisTraversal.js'
3+
4+
describe('Morris Inorder Traversal', () => {
5+
it('should return inorder traversal for a binary tree', () => {
6+
// Tree:
7+
// 4
8+
// / \
9+
// 2 5
10+
// / \
11+
// 1 3
12+
const root = new Node(4)
13+
root.left = new Node(2)
14+
root.right = new Node(5)
15+
root.left.left = new Node(1)
16+
root.left.right = new Node(3)
17+
18+
const result = morrisTraversal(root)
19+
expect(result).toEqual([1, 2, 3, 4, 5])
20+
})
21+
22+
it('should return empty array for null input', () => {
23+
const result = morrisTraversal(null)
24+
expect(result).toEqual([])
25+
})
26+
27+
it('should handle larger tree', () => {
28+
// Tree:
29+
// 7
30+
// / \
31+
// 5 8
32+
// / \
33+
// 3 6
34+
// \
35+
// 9
36+
const root = new Node(7)
37+
root.left = new Node(5)
38+
root.right = new Node(8)
39+
root.left.left = new Node(3)
40+
root.left.right = new Node(6)
41+
root.left.right.right = new Node(9)
42+
43+
const result = morrisTraversal(root)
44+
expect(result).toEqual([3, 5, 6, 9, 7, 8])
45+
})
46+
})

0 commit comments

Comments
 (0)