1.题目
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
2.思路
第一种方法是递归,
第二种方法是压栈:
将节点左子树全部压栈
弹出栈顶所有没有右子树的元素并将其加入遍历结果,直到出现右子树
若当前元素有右子树,则将当前元素加入遍历结果
指向当前节点右子树
若当前节点为空,则结束遍历;若当前节点不为空,则继续循环上述操作
3.解题:
方法一
public class InorderTraversal {
public List<Integer> inorderTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<Integer> result = new ArrayList<>();
result.addAll(inorderTraversal(root.left));
result.add(root.val);
result.addAll(inorderTraversal(root.right));
return result;
}
}
方法二
// 方法2
public class InorderTraversal1 {
public List<Integer> inorderTraversal(TreeNode root) {
Stack<TreeNode> treeNodeStack = new Stack<>();
List<Integer> result = new ArrayList<>();
TreeNode node = root;
while (node != null) {
while (node != null) {
treeNodeStack.push(node);
node = node.left;
}
while (treeNodeStack.size() > 0 && (node = treeNodeStack.pop()).right == null) {
result.add(node.val);
}
// node不可能为null
if (node.right != null) {
result.add(node.val);
}
node = node.right;
}
return result;
}
}