题目
给定一个二叉树的根节点root,返回它的中序遍历。
示例
输入:root = [1,null,2,3]
输出:[1,3,2]
递归实现
思路分析
- 递归主要思路有以下几点:
- 结束条件 -----> 当前节点为null
- 递归逻辑 -----> 先递归左子树,然后根节点,最后右子树
- 具体操作 -----> 添加节点的值到集合
- 返回值 -----> 返回集合
具体代码
class Solution {
//返回的集合
List<Integer> res = new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
//结束条件
if(root == null){
return new ArrayList<Integer>();
}
//先遍历左子树
inorderTraversal(root.left);
//添加根节点
res.add(root.val);
//最后遍历右子树
inorderTraversal(root.right);
return res;
}
}
迭代实现
思路分析
- 利用栈的先进后出的特性来实现二叉树的中序遍历
- 因为中序遍历的顺序是左 -- 根 -- 右
- 首先将根节点加入到栈中
- 然后不断的去遍历当前节点的左子节点,将左子节点不断的加入到栈中
- 当没有左子节点时,此时栈中最底部就是根节点,最顶部就是最左边的叶子节点
- 依次弹出栈顶节点,将节点值添加到集合中
- 再去将当前节点的右子节点加入到栈中
具体代码
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
LinkedList<TreeNode> stack = new LinkedList<>();
while(stack.size()>0 || root != null){
if(root != null){
stack.addLast(root);
//不断去遍历当前节点的左子节点
root = root.left;
}else{
//此时说明已经没有左子节点了,然后弹出栈顶节点
TreeNode temp = stack.removeLast();
res.add(temp.val);
//再去遍历当前节点的右子节点
root = temp.right;
}
}
return res;
}