美文网首页算法
LeetCode题解:二叉树的中序遍历

LeetCode题解:二叉树的中序遍历

作者: 搬码人 | 来源:发表于2022-03-20 20:37 被阅读0次

    题目描述

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

    示例

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

    思路方法

    递归

    首先我们需要了解什么是二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。
    定义 inorder(root) 表示当前遍历到root 节点的答案,那么按照定义,我们只要递归调用 inorder(root.left) 来遍历 root 节点的左子树,然后将 root 节点的值加入答案,再递归调用inorder(root.right) 来遍历 root 节点的右子树即可,递归终止的条件为碰到空节点。

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode() {}
     *     TreeNode(int val) { this.val = val; }
     *     TreeNode(int val, TreeNode left, TreeNode right) {
     *         this.val = val;
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
    class Solution {
        public List<Integer> inorderTraversal(TreeNode root) {
            List<Integer> res = new ArrayList<Integer>();
            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)

    迭代

    方法一的递归函数我们也可以用迭代的方式实现,两种方式是等价的,区别在于递归的时候隐式地维护了一个栈,而我们在迭代的时候需要显式地将这个栈模拟出来,其他都相同。(动画过程可以上LeetCode观看,更易理解)

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode() {}
     *     TreeNode(int val) { this.val = val; }
     *     TreeNode(int val, TreeNode left, TreeNode right) {
     *         this.val = val;
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
    class Solution {
        public List<Integer> inorderTraversal(TreeNode root) {
           List<Integer> res = new ArrayList<Integer>();
           Deque<TreeNode> stk = new LinkedList<TreeNode>();
           while(root!=null||!stk.isEmpty()){
               while(root!=null){
                   stk.push(root);
                   root = root.left;
               }
               root = stk.pop();
               res.add(root.val);
               root = root.right;
           }
           return res; 
        }
    }
    

    复杂度分析

    • 时间复杂度:O(n)
    • 空间复杂度:O(n)

    相关文章

      网友评论

        本文标题:LeetCode题解:二叉树的中序遍历

        本文链接:https://www.haomeiwen.com/subject/smyadrtx.html