题目描述
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [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);
}
}
}