题目链接
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
描述
给定一个二叉树,返回它的中序 遍历。
示例
输入: [1,null,2,3]
输出: [1,3,2]
代码
递归
时间复杂度O(N),空间复杂度O(N),因为需要隐式的维护一个栈
中序遍历的递归写法很简单,注意判定即可,参考代码如下
class Solution {
List<Integer> list;
public List<Integer> inorderTraversal(TreeNode root) {
list = new ArrayList<>();
inorder(root);
return list;
}
public void inorder(TreeNode root){
if (root == null) {
return;
}
inorder(root.left);
list.add(root.val);
inorder(root.right);
}
}
迭代
可以去看《程序员代码面试指南》,这个是看着书上写的。
迭代就是自己维护一个栈来保存信息,执行过程如下:
1. 申请一个新的栈stack,保存信息,以及一个新的集合list,保存结果。假设传入的初始节点为root
2. 如果root不为空,把root压入stack,然后令root=root.left,重复步骤2
3. 如果root为空,从栈中弹出一个元素,赋给root,即root=stack.pop(),然后在list.add(root.val),之后令root=root.right,如果root或者stack不为空,再执行步骤2
4. 当stack和root都为空的时候,过程结束,返回结果
以一个例子进行演示,假设给定一个二叉树为[1, 2, 3, 4, 5, 6, 7]
- 申请一个新的栈stack,保存信息,申请一个新的集合list,保存结果。给定节点为root
- 初始时root为节点1,将节点1压入stack,然后令root=root.left,此时stack中数据为 1 (栈定到栈底,1表示
节点1),list中没有数据
- 此时root为节点2,将节点2压入stack,然后令root=root.left,此时stack中数据为2 1,list中没有数据
root为节点4,将节点4压入stack,然后令root=root.left,此时stack中数据为4 2 1,list中没有数据
- root为空,从stack中弹出节点4,赋值给root,然后将root.val添加进list,之后令root=root.right,此时
stack中数据为2 1, list中数据为4
- root为空,从stack中弹出节点2,赋值给root,然后将root.val添加进list,之后令root=root.right,此时
stack中数据为1, list中数据为4 2
- root为节点5,将节点5压入stack,然后令root=root.left,此时stack中数据为5 1,list中数据为4 2
- root为空,从stack中弹出节点5,赋值给root,然后将root.val添加进list,之后令root=root.right,此时
stack中数据为1,list中数据为4 2 5
- root为空,从stack中弹出节点1,赋值给root,然后将root.val添加进list,之后令root=root.right,此时
stack中数据为空, list中数据为4 2 5 1
- root为节点3,将节点3压入stack,然后令root=root.left,此时stack中数据为3,list中数据为4 2 5 1
- root为节点6,将节点6压入stack,然后令root=root.left,此时stack中数据为6 3,list中数据为4 2 5 1
- root为空,从stack弹出节点6,赋值给root,然后将root.val添加进list,之后令root=root.right,此时stack
中数据为3,list中数据为4 2 5 1 6
- root为空,从stack弹出节点3,赋值给root,然后将root.val添加进list,之后令root=root.right,此时stack
中数据为空,list中数据为4 2 5 1 6 3
- root为节点7,将节点7让如stack,然后令root=root.left,此时stack中数据为7,list中数据为4 2 5 1 6 3
- root为空,从stack弹出节点7,赋值给root,然后将root.val添加进list,之后令root=root.right,此时stack
中数据为空,list中数据为4 2 5 1 6 3 7
- root为空,同时stack为空,过程结束,返回list
代码如下
class Solution{
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Deque<TreeNode> stack = new LinkedList<>();
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;
}
}