/* Author: King, wangjingui@outlook.com Date: Dec 20, 2014 Problem: Binary Tree Inorder Traversal Difficulty: Easy Source: https://oj.leetcode.com/problems/binary-tree-inorder-traversal/ Notes: Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 \ 2 / 3 return [1,3,2]. Note: Recursive solution is trivial, could you do it iteratively? Solution: 1. Recursive solution. Time: O(n), Space: O(n). 2. Iterative way (stack). Time: O(n), Space: O(n). 3. Threaded tree (Morris). Time: O(n), Space: O(1). */ /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public List inorderTraversal_1(TreeNode root) { List res = new ArrayList(); if (root == null) return res; inorder(root, res); return res; } public void inorder(TreeNode root, List res) { if (root == null) return; inorder(root.left, res); res.add(root.val); inorder(root.right, res); } public List inorderTraversal_2(TreeNode root) { List res = new ArrayList(); Stack stk = new Stack(); TreeNode cur = root; while (stk.isEmpty() == false || cur != null) { if (cur != null) { stk.push(cur); cur = cur.left; } else { cur = stk.pop(); res.add(cur.val); cur = cur.right; } } return res; } public List inorderTraversal(TreeNode root) { List res = new ArrayList(); TreeNode cur = root; while (cur != null) { if (cur.left == null) { res.add(cur.val); cur = cur.right; } else { TreeNode node = cur.left; while (node.right != null && node.right != cur) node = node.right; if (node.right == null) { node.right = cur; cur = cur.left; } else { res.add(cur.val); node.right = null; cur = cur.right; } } } return res; } }