[leetcode] 94. Binary Tree Inorder Traversal 二叉树的中序遍历
题目大意
https://leetcode.com/problems/binary-tree-inorder-traversal/description/
94. Binary Tree Inorder Traversal
Given a binary tree, return the inorder traversal of its nodes' values.
Example:
- Input: [1,null,2,3]
- 1
- \
- 2
- /
- 3
- Output: [1,3,2]
Follow up: Recursive solution is trivial, could you do it iteratively?
解题思路
中序遍历:左根右
Approach 1: Recursive Approach 递归
The first method to solve this problem is using recursion. This is the classical method and is straightforward. We can define a helper function to implement recursion.
Python解法
- class Solution(object):
- def inorderTraversal(self, root): # 递归
- """
- :type root: TreeNode
- :rtype: List[int]
- """
- if not root:
- return []
- return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)
Java解法
- class Solution {
- public List < Integer > inorderTraversal(TreeNode root) {
- List < Integer > res = new ArrayList < > ();
- helper(root, res);
- return res;
- }
- public void helper(TreeNode root, List < Integer > res) {
- if (root != null) {
- if (root.left != null) {
- helper(root.left, res);
- }
- res.add(root.val);
- if (root.right != null) {
- helper(root.right, res);
- }
- }
- }
- }
Complexity Analysis
Time complexity : O(n)O(n). The time complexity is O(n)O(n) because the recursive function is T(n) = 2 \cdot T(n/2)+1T(n)=2⋅T(n/2)+1.
Space complexity : The worst case space required is O(n)O(n), and in the average case it's O(log(n))O(log(n)) where nn is number of nodes.
Approach 2: Iterating method using Stack 迭代(基于栈)
The strategy is very similiar to the first method, the different is using stack.
伪代码如下(摘录自Wikipedia Tree_traversal)
- iterativeInorder(node)
- parentStack = empty stack
- while (not parentStack.isEmpty() or node ≠ null)
- if (node ≠ null)
- parentStack.push(node)
- node = node.left
- else
- node = parentStack.pop()
- visit(node)
- node = node.right
Python解法
- class Solution(object):
- def inorderTraversal(self, root): # 迭代
- """
- :type root: TreeNode
- :rtype: List[int]
- """
- stack = []
- res = []
- while root or stack:
- while root:
- stack.append(root)
- root = root.left
- root = stack.pop()
- res.append(root.val)
- root = root.right
- return res
Java解法
- public class Solution {
- public List < Integer > inorderTraversal(TreeNode root) {
- List < Integer > res = new ArrayList < > ();
- Stack < TreeNode > stack = new Stack < > ();
- TreeNode curr = root;
- while (curr != null || !stack.isEmpty()) {
- while (curr != null) {
- stack.push(curr);
- curr = curr.left;
- }
- curr = stack.pop();
- res.add(curr.val);
- curr = curr.right;
- }
- return res;
- }
- }
Complexity Analysis
Time complexity : O(n)O(n).
Space complexity : O(n)O(n).
Approach 3: Morris Traversal
In this method, we have to use a new data structure-Threaded Binary Tree, and the strategy is as follows:
- Step 1: Initialize current as root
- Step 2: While current is not NULL,
- If current does not have left child
- a. Add current’s value
- b. Go to the right, i.e., current = current.right
- Else
- a. In current's left subtree, make current the right child of the rightmost node
- b. Go to this left child, i.e., current = current.left
For example:
- 1
- / \
- 2 3
- / \ /
- 4 5 6
First, 1 is the root, so initialize 1 as current, 1 has left child which is 2, the current's left subtree is
- 2
- / \
- 4 5
So in this subtree, the rightmost node is 5, then make the current(1) as the right child of 5. Set current = cuurent.left (current = 2). The tree now looks like:
- 2
- / \
- 4 5
- \
- 1
- \
- 3
- /
- 6
For current 2, which has left child 4, we can continue with thesame process as we did above
- 4
- \
- 2
- \
- 5
- \
- 1
- \
- 3
- /
- 6
then add 4 because it has no left child, then add 2, 5, 1, 3 one by one, for node 3 which has left child 6, do the same as above. Finally, the inorder taversal is [4,2,5,1,6,3].
For more details, please check Threaded binary tree and Explaination of Morris Method
Python解法
- class Solution(object):
- def inorderTraversal(self, root): # Morris Traversal
- """
- :type root: TreeNode
- :rtype: List[int]
- """
- res = []
- curr, pre = root, None
- while curr:
- if curr.left:
- pre = curr.left
- while pre.right:
- pre = pre.right
- pre.right = curr
- curr.left, curr = None, curr.left
- else:
- res.append(curr.val)
- curr = curr.right
- return res
Java解法
- class Solution {
- public List < Integer > inorderTraversal(TreeNode root) {
- List < Integer > res = new ArrayList < > ();
- TreeNode curr = root;
- TreeNode pre;
- while (curr != null) {
- if (curr.left == null) {
- res.add(curr.val);
- curr = curr.right; // move to next right node
- } else { // has a left subtree
- pre = curr.left;
- while (pre.right != null) { // find rightmost
- pre = pre.right;
- }
- pre.right = curr; // put cur after the pre node
- TreeNode temp = curr; // store cur node
- curr = curr.left; // move cur to the top of the new tree
- temp.left = null; // original cur left be null, avoid infinite loops
- }
- }
- return res;
- }
- }
Complexity Analysis
Time complexity : O(n)O(n). To prove that the time complexity is O(n)O(n), the biggest problem lies in finding the time complexity of finding the predecessor nodes of all the nodes in the binary tree. Intuitively, the complexity is O(nlogn)O(nlogn), because to find the predecessor node for a single node related to the height of the tree. But in fact, finding the predecessor nodes for all nodes only needs O(n)O(n) time. Because a binary Tree with nn nodes has n-1n−1 edges, the whole processing for each edges up to 2 times, one is to locate a node, and the other is to find the predecessor node. So the complexity is O(n)O(n).
Space complexity : O(n)O(n). Arraylist of size nn is used.
参考:
https://leetcode.com/problems/binary-tree-inorder-traversal/solution/
http://bookshadow.com/weblog/2015/01/19/leetcode-binary-tree-inorder-traversal/
[leetcode] 94. Binary Tree Inorder Traversal 二叉树的中序遍历的更多相关文章
- LeetCode 94. Binary Tree Inorder Traversal 二叉树的中序遍历 C++
Given a binary tree, return the inorder traversal of its nodes' values. Example: Input: [,,] \ / Out ...
- [LeetCode] 94. Binary Tree Inorder Traversal(二叉树的中序遍历) ☆☆☆
二叉树遍历(前序.中序.后序.层次.深度优先.广度优先遍历) 描述 解析 递归方案 很简单,先左孩子,输出根,再右孩子. 非递归方案 因为访问左孩子后要访问右孩子,所以需要栈这样的数据结构. 1.指针 ...
- 【LeetCode】Binary Tree Inorder Traversal(二叉树的中序遍历)
这道题是LeetCode里的第94道题. 题目要求: 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单 ...
- [LeetCode] Binary Tree Inorder Traversal 二叉树的中序遍历
Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...
- Leetcode94. Binary Tree Inorder Traversal二叉树的中序遍历(两种算法)
给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 递归: class So ...
- [LeetCode] 144. Binary Tree Preorder Traversal 二叉树的先序遍历
Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...
- Leetcode 94 Binary Tree Inorder Traversal 二叉树
二叉树的中序遍历,即左子树,根, 右子树 /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *lef ...
- [LeetCode] 145. Binary Tree Postorder Traversal 二叉树的后序遍历
Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...
- [leetcode]94. Binary Tree Inorder Traversal二叉树中序遍历
Given a binary tree, return the inorder traversal of its nodes' values. Example: Input: [1,null,2,3] ...
随机推荐
- React Native的SliderIOS滑块组件
import React,{Component}from 'react'; import { AppRegistry, StyleSheet, Text, View, SliderIOS, } fro ...
- Linux——vim/vi 简单学习笔记
Vim/Vi是一个功能强大的全屏幕文本编辑器,是Linux/UNIX上最常用的文本编辑器,它的作用是建立.编辑.显示文本文件.Vim/Vi 没有菜单,只有命令. 早前也用过Vim变过C++/C的代码, ...
- Python 实现协程
协程的概念 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程.(其实并没有说明白~) 我觉得单说协程,比较抽象,如果对线程有一定了解的话,应该就比较 ...
- python 阶乘
product= i= : product=i*product print('i=%d' %i,end='') print('\tproduct=%d' %product) i+= print('\n ...
- [ios]cocos2dx获取设备的当前预言
参考:http://blog.sina.com.cn/s/blog_923fdd9b0101fmpv.html http://bbs.9ria.com/thread-199313-1-1.html / ...
- Java-Java程序设计的基本概念
2017-10-06 15:31:39 一.Java程序的基本构成 二.数据类型与标识符 数据类型 标识符 广义的用于定义各种对象名称的字符串集合称为标识符,标识符一般分为用户 ...
- 合并两个dt
C#代码中实现两个表(DataTable)的关联查询(JOIN) 之前通常都是使用SQL直接从数据库中取出表1和表2关联查询后的数据,只需要用一个JOIN就可以了,非常方便.近日遇到一种情况,两个 ...
- splay训练
1, CF 455D 2, CF 420D 3, CF 414E
- 多目标跟踪方法:deep-sort
多目标跟踪方法:deep-sort deep_sort Multitarget tracking data association 读'Simple Online and Realtime Track ...
- nyoj-310-河南省第四届省赛题目-二分+dinic
SECRET 时间限制:3000 ms | 内存限制:65535 KB 难度:6 描述 Dr.Kong is constructing a new machine and wishes to ...