刷题36 二叉树中序遍历

26 阅读1分钟

给定一个二叉树的根节点 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;
}

}