【二叉树】LeetCode 94 二叉树的中序遍历

580 阅读1分钟

题目

给定一个二叉树的根节点root,返回它的中序遍历。

示例

tree.jpg

输入:root = [1,null,2,3]
输出:[1,3,2]

递归实现

思路分析

  • 递归主要思路有以下几点:
  • 结束条件 -----> 当前节点为null
  • 递归逻辑 -----> 先递归左子树,然后根节点,最后右子树
  • 具体操作 -----> 添加节点的值到集合
  • 返回值 -----> 返回集合

具体代码

class Solution {
    //返回的集合
    List<Integer>  res = new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
        //结束条件
        if(root == null){
            return new ArrayList<Integer>();
        } 
        //先遍历左子树
        inorderTraversal(root.left);
        //添加根节点
        res.add(root.val);
        //最后遍历右子树
        inorderTraversal(root.right);
        return res;
    }
}

迭代实现

思路分析

  • 利用栈的先进后出的特性来实现二叉树的中序遍历
  • 因为中序遍历的顺序是左 -- 根 -- 右
  • 首先将根节点加入到栈中
  • 然后不断的去遍历当前节点的左子节点,将左子节点不断的加入到栈中
  • 当没有左子节点时,此时栈中最底部就是根节点,最顶部就是最左边的叶子节点
  • 依次弹出栈顶节点,将节点值添加到集合中
  • 再去将当前节点的右子节点加入到栈中

具体代码

  public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        LinkedList<TreeNode> stack = new LinkedList<>();
        while(stack.size()>0 || root != null){
            if(root != null){
                stack.addLast(root);
                //不断去遍历当前节点的左子节点
                root = root.left;
            }else{
                //此时说明已经没有左子节点了,然后弹出栈顶节点
                TreeNode temp = stack.removeLast();
                res.add(temp.val);
                //再去遍历当前节点的右子节点
                root = temp.right;
            }
    }
        return res;
    }