题目描述
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
2
/
3
1
2
/
3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<Integer>(); inorder(root, list); return list; } /** * 中序递归遍历 * @param root * @param list */ public void inorder(TreeNode root, List<Integer> list) { if (root == null) { return; } inorder(root.left, list); list.add(root.val); inorder(root.right, list); } /** * 中序非递归排序 使用栈来存储结点信息 * @param root * @param list */ public void inorder1(TreeNode root, List<Integer> list) { Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode p = root; while (p != null || !stack.isEmpty()) { if (p != null) { stack.push(p); p = p.left; } else { p = stack.pop(); list.add(p.val); p = p.right; } } } /** * 颜色标记法 中序非递归遍历 * 核心思想如下: 使用颜色标记节点的状态,新节点为白色,已访问的节点为灰色。 如果遇到的节点为白色,则将其标记为灰色,然后将其右子节点、自身、左子节点依次入栈。 如果遇到的节点为灰色,则将节点的值输出 * @param root * @param list */ public void inorder2(TreeNode root, List<Integer> list) { Stack<Object> stack = new Stack<Object>(); stack.push(root); while (!stack.isEmpty()) { Object pop = stack.pop(); if (pop == null) { continue; } if (pop instanceof TreeNode) { TreeNode tmp = (TreeNode) pop; stack.push(tmp.right); stack.push(tmp.val); stack.push(tmp.left); } else { list.add((Integer) pop); } } }