自学内容网 自学内容网

【Leetcode Top 100】94. 二叉树的中序遍历

问题背景

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

数据约束

  • 树中节点数目在范围 [ 0 , 100 ] [0, 100] [0,100]
  • − 100 ≤ N o d e . v a l ≤ 100 -100 \le Node.val \le 100 100Node.val100

解题过程

中序遍历,二叉树的基本操作。
递归的方法是先递归左子树,访问当前节点,然后访问右子树即可。
非递归的方法是在左子树非空的情况下,不断地往左子树遍历,沿途用栈来记录节点。一旦左子树为空,那么应当访问当前栈中的第一个节点,接下来处理右子树。

二叉树的遍历,递归与非递归的写法时空复杂度差异不大。一般来说,只要递归的做法能解决问题,就不必特意实现非递归的方式。

具体实现

递归

/**
 * 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<>();
        inorder(root, res);
        return res;
    }

    // 原方法要返回一个列表,不方便递归操作,重新定义一个方法来实现
    private void inorder(TreeNode root, List<Integer> list) {
        // 递归边界是当前节点为空,直接返回
        if(root == null) {
            return;
        }
        inorder(root.left, list); // 递归遍历左子树
        list.add(root.val); // 访问当前节点
        inorder(root.right, list); // 递归遍历右子树
    }
}

非递归

/**
 * 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<>();
        Stack<TreeNode> stack = new Stack<>();
        // 只要左子树不为空,就不断地往左子树遍历
        while (!stack.isEmpty() || root != null) {
            if (root != null) {
                stack.push(root); // 沿途节点进栈
                root = root.left; // 工作指针指向左子树
            } else {
                root = stack.pop(); 
                res.add(root.val); // 访问栈中的第一个节点
                root = root.right; // 工作指针指向右子树
            }
        }
        return res;
    }
}

原文地址:https://blog.csdn.net/2401_88859777/article/details/144322232

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!