Python
class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def inorderTraversal(root): current = root while current: if current.left is None: print(current.val) # Process the current node current = current.right else: # Find the predecessor of the current node predecessor = current.left while predecessor.right and predecessor.right != current: predecessor = predecessor.right if predecessor.right is None: # Establish the temporary link to the current node predecessor.right = current current = current.left else: # Remove the temporary link and process the current node predecessor.right = None print(current.val) # Process the current node current = current.right # Test the implementation # Create a binary tree: 1 -> 2 / \ 3 -> 4 5 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) print("In-order traversal:") inorderTraversal(root) |
Java
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; left = null; right = null; } } public class BinaryTreeInorderTraversal { public static void inorderTraversal(TreeNode root) { TreeNode current = root; while (current != null) { if (current.left == null) { System.out.print(current.val + " "); // Process the current node current = current.right; } else { // Find the predecessor of the current node TreeNode predecessor = current.left; while (predecessor.right != null && predecessor.right != current) { predecessor = predecessor.right; } if (predecessor.right == null) { // Establish the temporary link to the current node predecessor.right = current; current = current.left; } else { // Remove the temporary link and process the current node predecessor.right = null; System.out.print(current.val + " "); // Process the current node current = current.right; } } } } public static void main(String[] args) { // Create a binary tree: 1 -> 2 / \ 3 -> 4 5 TreeNode root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(3); root.left.left = new TreeNode(4); root.left.right = new TreeNode(5); System.out.println("In-order traversal:"); inorderTraversal(root); } } |
Javascript
class TreeNode { constructor(val) { this.val = val; this.left = null; this.right = null; } } const inorderTraversal = (root) => { let current = root; while (current) { if (current.left === null) { console.log(current.val); // Process the current node current = current.right; } else { // Find the predecessor of the current node let predecessor = current.left; while (predecessor.right !== null && predecessor.right !== current) { predecessor = predecessor.right; } if (predecessor.right === null) { // Establish the temporary link to the current node predecessor.right = current; current = current.left; } else { // Remove the temporary link and process the current node predecessor.right = null; console.log(current.val); // Process the current node current = current.right; } } } }; // Test the implementation // Create a binary tree: 1 -> 2 / \ 3 -> 4 5 const root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(3); root.left.left = new TreeNode(4); root.left.right = new TreeNode(5); console.log("In-order traversal:"); inorderTraversal(root); |
These implementations use the Morris Traversal algorithm to perform in-order traversal without using any additional space other than O(1). The algorithm establishes temporary links between nodes and their predecessors, allowing efficient traversal and processing of the tree nodes.
Note: The code examples assume that the tree nodes have a val
, left
, and right
property to represent the value, left child, and right child of each node, respectively.