给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:
输入: root = [1,null,2,3]
输出: [1,3,2]
示例 2:
输入: root = []
输出: []
示例 3:
输入: root = [1]
输出: [1]
提示:
- 树中节点数目在范围
[0, 100]内 -100 <= Node.val <= 100
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
题解:
递归:
class Solution {
List<Integer>result=new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
//中序遍历 左 根 右
visit(root);
return result;
}
public void visit(TreeNode root){
if(root==null)
return;
visit(root.left);
result.add(root.val);
visit(root.right);
}
}
迭代: (颜色标记法)
class Solution {
class ColorNode {
TreeNode node;
boolean flag; // true 为访问过; false 为未访问.
ColorNode (TreeNode node, boolean flag) {
this.node = node;
this.flag = flag;
}
}
public List<Integer> inorderTraversal(TreeNode root) {
if (root == null) return new ArrayList<Integer>();
List<Integer> res = new ArrayList<>();
ArrayDeque<ColorNode> stack = new ArrayDeque<>();
stack.offerFirst(new ColorNode(root, false));
while (stack.size() != 0) {
ColorNode cn = stack.pollFirst();
if (cn.flag == false) {
if (cn.node.right != null) stack.offerFirst(new ColorNode(cn.node.right, false));
stack.offerFirst(new ColorNode(cn.node, true));
if (cn.node.left != null) stack.offerFirst(new ColorNode(cn.node.left, false));
} else {
res.add(cn.node.val);
}
}
return res;
}
}