https://oj.leetcode.com/problems/binary-tree-inorder-traversal/
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?
解题思路:
递归
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public List<Integer> inorderTraversal(TreeNode root) { List list = new ArrayList<Integer>(); if(root == null){ return list; } list.addAll(inorderTraversal(root.left)); list.add(root.val); list.addAll(inorderTraversal(root.right)); return list; } }
非递归方法
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<Integer> (); Stack<TreeNode> stack = new Stack<TreeNode> (); while(!stack.empty() || root != null){ while(root != null){ stack.push(root); root = root.left; } if(!stack.empty()){ root = stack.pop(); list.add(root.val); root = root.right; } } return list; } }
上面的内层while是redundant的。想想为什么?这里的思路是,将当前节点推进栈,然后将当前节点赋值为它的左节点。如此往复直到左节点为空,这时从栈顶弹出一个元素,处理它。然后再把当前节点的右节点赋值为当前节点。循环上面的过程。
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<Integer> (); Stack<TreeNode> stack = new Stack<TreeNode> (); while(!stack.empty() || root != null){ if(root != null){ stack.push(root); root = root.left; }else if(!stack.empty()){ root = stack.pop(); list.add(root.val); root = root.right; } } return list; } }