leetcode 94.二叉树的中序遍历 Java

题目链接

https://leetcode-cn.com/problems/binary-tree-inorder-traversal/

描述

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

示例

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

代码

递归

时间复杂度O(N),空间复杂度O(N),因为需要隐式的维护一个栈
中序遍历的递归写法很简单,注意判定即可,参考代码如下
class Solution {
    List<Integer> list;

    public List<Integer> inorderTraversal(TreeNode root) {
        list = new ArrayList<>();
        inorder(root);
        return list;
    }

    public void inorder(TreeNode root){
        if (root == null) {
            return;
        }

        inorder(root.left);
        list.add(root.val);
        inorder(root.right);
    }
}

迭代

可以去看《程序员代码面试指南》,这个是看着书上写的。

迭代就是自己维护一个栈来保存信息,执行过程如下:
1. 申请一个新的栈stack,保存信息,以及一个新的集合list,保存结果。假设传入的初始节点为root
2. 如果root不为空,把root压入stack,然后令root=root.left,重复步骤2
3. 如果root为空,从栈中弹出一个元素,赋给root,即root=stack.pop(),然后在list.add(root.val),之后令root=root.right,如果root或者stack不为空,再执行步骤2
4. 当stack和root都为空的时候,过程结束,返回结果
以一个例子进行演示,假设给定一个二叉树为[1, 2, 3, 4, 5, 6, 7]

 - 申请一个新的栈stack,保存信息,申请一个新的集合list,保存结果。给定节点为root
 
 - 初始时root为节点1,将节点1压入stack,然后令root=root.left,此时stack中数据为 1 (栈定到栈底,1表示
 节点1),list中没有数据

 - 此时root为节点2,将节点2压入stack,然后令root=root.left,此时stack中数据为2 1,list中没有数据

 root为节点4,将节点4压入stack,然后令root=root.left,此时stack中数据为4 2 1,list中没有数据

 - root为空,从stack中弹出节点4,赋值给root,然后将root.val添加进list,之后令root=root.right,此时
 stack中数据为2 1, list中数据为4

 - root为空,从stack中弹出节点2,赋值给root,然后将root.val添加进list,之后令root=root.right,此时
 stack中数据为1, list中数据为4 2

 - root为节点5,将节点5压入stack,然后令root=root.left,此时stack中数据为5 1,list中数据为4 2

 - root为空,从stack中弹出节点5,赋值给root,然后将root.val添加进list,之后令root=root.right,此时
 stack中数据为1,list中数据为4 2 5

 - root为空,从stack中弹出节点1,赋值给root,然后将root.val添加进list,之后令root=root.right,此时
 stack中数据为空, list中数据为4 2 5 1

 - root为节点3,将节点3压入stack,然后令root=root.left,此时stack中数据为3,list中数据为4 2 5 1

 - root为节点6,将节点6压入stack,然后令root=root.left,此时stack中数据为6 3,list中数据为4 2 5 1

 - root为空,从stack弹出节点6,赋值给root,然后将root.val添加进list,之后令root=root.right,此时stack
 中数据为3,list中数据为4 2 5 1 6

 - root为空,从stack弹出节点3,赋值给root,然后将root.val添加进list,之后令root=root.right,此时stack
 中数据为空,list中数据为4 2 5 1 6 3

 - root为节点7,将节点7让如stack,然后令root=root.left,此时stack中数据为7,list中数据为4 2 5 1 6 3

 - root为空,从stack弹出节点7,赋值给root,然后将root.val添加进list,之后令root=root.right,此时stack
 中数据为空,list中数据为4 2 5 1 6 3 7

 - root为空,同时stack为空,过程结束,返回list

代码如下

class Solution{
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Deque<TreeNode> stack = new LinkedList<>();

        while (root != null || !stack.isEmpty()) {
            if (root != null) {
                stack.push(root);
                root = root.left;
            } else {
                root = stack.pop();
                res.add(root.val);
                root = root.right;
            }
        }

        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值