LeetCode刻意练习22--二叉树的中序遍历

中序遍历(左子树->根节点->右子树)
方法一:
递归

    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ans = new LinkedList<>();
        traversal(root, ans);
        return ans;
    }

    private void traversal(TreeNode root, List<Integer> ans) {
        if (root != null) {
            if (root.left != null)
                traversal(root.left, ans);
            ans.add(root.val);
            if (root.right != null)
                traversal(root.right, ans);
        }
    }

在这里插入图片描述
方法二:
循环迭代,这里使用栈来模拟递归过程。
思路:
1.创建一个空栈s
2.用 cur来跟踪根结点,cur初始化为null.
3 如果cur不为空,则将它存进栈s中,并且,将cur沿着左子树下移,直到cur为空。
4.如果栈不为空,令cur指向栈顶元素的右子树,将栈顶元素弹出来,并且将这个弹出来的元素 存进链表。重复第三步
5.当栈为空,并且cur没有指向时,我们迭代结束

    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ans = new LinkedList<>();
        Stack<TreeNode> s = new Stack<>();
        TreeNode cur = root;
        while (cur != null || !s.isEmpty()) {
            while (cur != null) {
                s.push(cur);
                cur = cur.left;
            }
            if (!s.isEmpty()) {
                cur = s.peek().right;
                ans.add(s.pop().val);
            }
        }

        return ans;
    }

在这里插入图片描述

发布了49 篇原创文章 · 获赞 2 · 访问量 872

猜你喜欢

转载自blog.csdn.net/qq_43720551/article/details/105030614