中序遍历
给定一个二叉树的根节点 root ,返回它的 中序 遍历。
中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树
示例
方法一:递归
class Solution {
List<Integer> res = new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
if(root == null) return res;
inorderTraversal(root.left);
res.add(root.val);
inorderTraversal(root.right);
return res;
}
}
方法二:迭代
1.初始化返回列表,判空,初始化栈,初始化cur节点
2.循环:当前节点不空或者栈不空
- 当前节点不空:从当前节点开始一直往左相继入栈
- 判断当栈不空,出栈,同时添加到res,当前节点指向右孩子
3.返回res
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root == null) return res;
LinkedList<TreeNode> stack = new LinkedList<>();
TreeNode cur = root;
while(cur != null || !stack.isEmpty()){
while(cur != null){
stack.addFirst(cur);
cur = cur.left;
}
if(!stack.isEmpty()){
cur = stack.removeFirst();
res.add(cur.val);
cur = cur.right;
}
}
return res;
}
}
方法三:Morris中序遍历
能将非递归的中序遍历空间复杂度降为 O(1)。