94 Binary Tree Inorder Traversal

原创 2015年11月21日 18:30:10

题目链接: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].

解题思路:
二叉树的中序遍历,一般有两种方法:
1. 递归
2. 迭代(利用栈)
本题的考察也是想让我们利用栈来实现中序遍历。
中序遍历不同于后序遍历,不需要标记是否已遍历过左子树。

递归代码实现:

/**
 * 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> res = new ArrayList<Integer>();  
        helper(root, res);  
        return res;  
    }  
    private void helper(TreeNode root, List<Integer> res)  
    {  
        if(root == null)  
            return;  
        helper(root.left,res);  
        res.add(root.val);  
        helper(root.right,res);  
    }
}
67 / 67 test cases passed.
Status: Accepted
Runtime: 1 ms

迭代代码实现:

/**
 * 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) {
        if(root == null)
            return new ArrayList();
        LinkedList<TreeNode> stack = new LinkedList();
        List<Integer> res = new ArrayList();
        while(root != null || !stack.isEmpty()) {
            if(root != null) {
                stack.push(root);
                root = root.left;
            } else {
                root = stack.pop();
                res.add(root.val);
                root = root.right;
            }
        }
        return res;
    }
}
67 / 67 test cases passed.
Status: Accepted
Runtime: 1 ms

下面这种方法是参考了大神的解法:http://blog.csdn.net/linhuanmars/article/details/20187257

最后我们介绍一种比较复杂的方法,这个问题我有个朋友在去 google onsite 的时候被问到了,就是如果用常量空间来中序遍历一颗二叉树。
这种方法叫 Morris Traversal
想用 O(1) 空间进行遍历,因为不能用栈作为辅助空间来保存付节点的信息,重点在于当访问到子节点的时候如何重新回到父节点(当然这里是指没有父节点指针,如果有其实就比较好办,一直找遍历的后驱结点即可)。
Morris 遍历方法用了线索二叉树,这个方法不需要为每个节点额外分配指针指向其前驱和后继结点,而是利用叶子节点中的右空指针指向中序遍历下的后继节点就可以了。

算法具体分情况如下:
1. 如果当前结点的左孩子为空,则输出当前结点并将其当前节点赋值为右孩子。
2. 如果当前节点的左孩子不为空,则寻找当前节点在中序遍历下的前驱节点(也就是当前结点左子树的最右孩子)。
接下来分两种情况:
a) 如果前驱节点的右孩子为空,将它的右孩子设置为当前节点(做线索使得稍后可以重新返回父结点)。然后将当前节点更新为当前节点的左孩子。
b) 如果前驱节点的右孩子为当前节点,表明左子树已经访问完,可以访问当前节点。将它的右孩子重新设为空(恢复树的结构)。输出当前节点。当前节点更新为当前节点的右孩子。

代码实现:

/**
 * 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) {  
        if(root == null)
            return new ArrayList<Integer>();
        List<Integer> res = new ArrayList();
        TreeNode cur = root;
        TreeNode pre = null;
        while(cur != null) {
            if(cur.left == null) {
                res.add(cur.val);
                cur = cur.right;
            } else {
                pre = cur.left;
                while(pre.right != null && pre.right != cur)
                    pre = pre.right;
                if(pre.right == null) {
                    pre.right = cur;
                    cur = cur.left;
                } else {
                    pre.right = null;
                    res.add(cur.val);
                    cur = cur.right;
                }
            }
        }
        return res;
    }  
}
67 / 67 test cases passed.
Status: Accepted
Runtime: 1 ms
版权声明:本文为博主原创文章,未经博主允许不得转载。

【LeetCode】94. Binary Tree Inorder Traversal 解题报告

转载请注明出处:http://blog.csdn.net/crazy1235/article/details/51471280Subject 出处:https://leetcode.com/pro...
  • crazy1235
  • crazy1235
  • 2016年05月22日 23:59
  • 8091

LeetCode 94 Binary Tree Inorder Traversal(Python详解及实现)

【题目】 Given a binary tree, return the inordertraversal of its nodes' values.   For example: Given bin...
  • yangjingjing9
  • yangjingjing9
  • 2017年08月10日 16:10
  • 208

LeetCode94 BinaryTreeInorderTraversal Java题解(递归 迭代)

题目: Given a binary tree, return the inorder traversal of its nodes' values. For example: Gi...
  • u012249528
  • u012249528
  • 2015年07月08日 09:57
  • 819

Leetcode_94_Binary Tree Inorder Traversal

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42876657 Given a binary tre...
  • pistolove
  • pistolove
  • 2015年01月19日 18:34
  • 1279

Binary Tree Inorder Traversal -- LeetCode

原题链接: http://oj.leetcode.com/problems/binary-tree-inorder-traversal/  通常,实现二叉树的遍历有两个常用的方法:一是用递归,二是使用...
  • linhuanmars
  • linhuanmars
  • 2014年03月01日 05:38
  • 16780

【LeetCode】【Python】Binary Tree Inorder Traversal

Given a binary tree, return the inorder traversal of its nodes' values. For example: Given bin...
  • u011613729
  • u011613729
  • 2014年07月25日 09:34
  • 2458

leetcode-94:Binary Tree Inorder Traversal (Java)

Binary Tree Inorder Traversal  即二叉树的中序遍历。 常见的有两种方法:递归和循环,其中递归调用的栈空间为树的高度,一般为o(logn...
  • wen1158646729
  • wen1158646729
  • 2015年08月18日 15:03
  • 779

【LeetCode】105. Construct Binary Tree from Preorder and Inorder Traversal 解题报告

转载请注明出处:http://blog.csdn.net/crazy1235/article/details/51471280Subject 出处:https://leetcode.com/pro...
  • crazy1235
  • crazy1235
  • 2016年06月01日 23:42
  • 5890

106 Construct Binary Tree from Inorder and Postorder Traversal

题目链接:https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/题目:Giv...
  • ChilseaSai
  • ChilseaSai
  • 2015年12月09日 20:29
  • 872

LeetCode 105:Construct Binary Tree from Preorder and Inorder Traversal

LeetCode 105: Given preorder and inorder traversal of a tree, construct the binary tree. 给定一个二叉树的...
  • sunao2002002
  • sunao2002002
  • 2015年05月20日 23:09
  • 1044
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:94 Binary Tree Inorder Traversal
举报原因:
原因补充:

(最多只允许输入30个字)