LeetCode94-二叉树的中序遍历

 

非商业,LeetCode链接附上:

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

进入正题。

 

题目:

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

 

示例:

示例 1:

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

示例 2:

输入:root = []
输出:[]

 

代码实现:

//节点
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode(int val) {
        this.val = val;
    }
}

//方法一 递归
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        
        List<Integer> res = new ArrayList<>();
        inOrder(root, res);
        return res;

    }

    public void inOrder(TreeNode root, List<Integer> res) {

        if(root == null) {
            return;
        }
        inOrder(root.left, res);
        res.add(root.val);
        inOrder(root.right, res);
    }
}
//时间复杂度O(n),空间复杂度O(n)

//方法二 迭代(栈)
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        
        List<Integer> res = new ArrayList<>();
        Deque<TreeNode> stack = new LinkedList<>();

        while (root != null || !stack.isEmpty()) {

            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            res.add(root.val);
            root = root.right;
        }
        
        return res;

    }
}
//时间复杂度O(n),空间复杂度O(n)

 

分析:

二叉树的中序遍历就是按“左-中-右”的顺序遍历所有的节点;

二叉树的遍历,递归需要更抽象的思考,怎样设置结束条件,如何“递”、怎么“归”;

迭代的方法是充分的利用栈的性质,将root节点及所有的左节点依次入栈,当不再有左节点时出栈,并将当前节点的右节点作为新的root节点遍历。

 

--End

 

posted @ 2020-11-30 16:50  黑冰台  阅读(110)  评论(0)    收藏  举报