94Binary Tree Inorder Traversal
来源:互联网 发布:广告终结者 mac 编辑:程序博客网 时间:2024/06/06 00:55
题目链接: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 / 3return [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: AcceptedRuntime: 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: AcceptedRuntime: 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: AcceptedRuntime: 1 ms
- 94Binary Tree Inorder Traversal
- [94]Binary Tree Inorder Traversal
- 94Binary Tree Inorder Traversal
- 94、Binary Tree Inorder Traversal
- 94 - Binary Tree Inorder Traversal
- 94-Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- C++赋值操作符重载简介
- path与classpath区别,内存管理
- 仿写tomcat服务器项目分析
- HTML5之file控件
- Android moveTaskToBack()方法实现手动隐藏当前Activity
- 94Binary Tree Inorder Traversal
- JAVA Socket基础例程
- NSTimer 两种常用创建方式的区别
- Picasso学习笔记
- 在iOS 8中使用UIAlertController
- LeetCode 之 Lowest Common Ancestor of a Binary Search Tree
- bzoj-2082 Divine divisor
- 最优二叉搜索树动态规划
- 闪屏页面开发遇到的问题you need to use a theme.appcompat theme (or descendant)