一、问题描述(二叉树中序遍历)
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 a binary tree node.
* 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> result = new ArrayList<Integer>();
if(root==null) return result;
Stack<TreeNode> stack = new Stack<TreeNode>();
HashSet<TreeNode> visitedSet = new HashSet<TreeNode>(); //已遍历过的节点不再遍历
stack.push(root);
while(!stack.empty()) {
TreeNode cur = stack.peek();
while(cur.left != null && !visitedSet.contains(cur.left)){
stack.push(cur.left);
cur = cur.left;
}
result.add(cur.val);
visitedSet.add(cur);
stack.pop();
if(cur.right != null){
stack.push(cur.right);
}
}
return result;
}
}
代码二
/**
* Definition for a binary tree node.
* 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> result = new ArrayList<Integer>();
if(root==null) return result;
Stack<TreeNode> stack = new Stack<TreeNode>();
HashSet<TreeNode> visitedSet = new HashSet<TreeNode>(); //已遍历过的节点不再遍历
stack.push(root);
visitedSet.add(root);
while(!stack.isEmpty()) {
TreeNode current = stack.peek();
if(current.left!=null && !visitedSet.contains(current.left)) {
stack.push(current.left);
}
else {
result.add(current.val);
visitedSet.add(current);
stack.pop();
if(current.right!=null)
stack.push(current.right);
}
}
return result;
}
}