LeetCode 94. Binary Tree Inorder Traversal(二叉树的中序遍历)

来源:互联网 发布:现在windows出到几了 编辑:程序博客网 时间:2024/05/17 22:27

原题网址:https://leetcode.com/problems/binary-tree-inorder-traversal/

Given a binary tree, return the inorder traversal of its nodes' values.

For example:
Given binary tree {1,#,2,3},

   1    \     2    /   3

return [1,3,2].

Note: Recursive solution is trivial, could you do it iteratively?

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.


OJ's Binary Tree Serialization:

The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.

Here's an example:

   1  / \ 2   3    /   4    \     5
The above binary tree is serialized as "{1,2,3,#,#,4,#,#,5}".

方法一:递归。

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    private List<Integer> traversal = new ArrayList<>();    private void traverse(TreeNode root) {        if (root == null) return;        if (root.left != null) traverse(root.left);        traversal.add(root.val);        if (root.right != null) traverse(root.right);    }    public List<Integer> inorderTraversal(TreeNode root) {        traverse(root);        return traversal;    }}

方法二:将方法一的递归之间修改为用栈实现。

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public List<Integer> inorderTraversal(TreeNode root) {        List<Integer> traversal = new ArrayList<>();        Stack<TreeNode> nodes = new Stack<>();        Stack<Integer> states = new Stack<>();        nodes.push(root);        states.push(1);        while (!nodes.isEmpty()) {            TreeNode node = nodes.pop();            int state = states.pop();            if (node == null) continue;            if (state == 1) {                nodes.push(node);                states.push(2);                nodes.push(node.left);                states.push(1);                continue;            } else if (state == 2) {                traversal.add(node.val);                nodes.push(node);                states.push(3);                nodes.push(node.right);                states.push(1);                continue;            } else {                // nothing to do            }        }        return traversal;    }}

方法三:通过prev来区分当前是正在向下遍历,还是已经遍历完成,以免重复压栈。

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public List<Integer> inorderTraversal(TreeNode root) {        List<Integer> traversal = new ArrayList<>();        if (root == null) return traversal;        Stack<TreeNode> nodes = new Stack<>();        TreeNode prev = null;        nodes.push(root);        while (!nodes.isEmpty()) {            TreeNode node = nodes.pop();            if (prev == null || node == prev.left || node == prev.right) {                if (node.left != null && node.right != null) {                    nodes.push(node.right);                    nodes.push(node);                    nodes.push(node.left);                } else if (node.left != null) {                    nodes.push(node);                    nodes.push(node.left);                } else if (node.right != null) {                    traversal.add(node.val);                    nodes.push(node.right);                } else {                     traversal.add(node.val);                }            } else {                traversal.add(node.val);            }            prev = node;        }        return traversal;    }}

简化:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public List<Integer> inorderTraversal(TreeNode root) {        List<Integer> results = new ArrayList<>();        if (root == null) return results;        ArrayDeque<TreeNode> stack = new ArrayDeque<>();        stack.push(root);        TreeNode prev = null;        while (!stack.isEmpty()) {            TreeNode node = stack.pop();            if (prev == null || prev.left == node || prev.right == node) {                if (node.right != null) stack.push(node.right);                if (node.left != null) {                    stack.push(node);                    stack.push(node.left);                } else {                    results.add(node.val);                }            } else {                results.add(node.val);            }            prev = node;        }        return results;    }}


0 0
原创粉丝点击