题目描述:
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
思路:
递归 :在类中添加一个列表记录每个遍历到的值,写一个递归函数按照中序遍历访问.
1.如果当前节点为空返回.如果当前节点左孩子不为空,递归调用它.
2.再将当前节点的值添加到列表中.
3.如果当前节点右孩子不为空,递归调用它.
迭代:先访问所有左孩子,利用栈存放访问经过的父节点,当没有左子节点时,再弹出栈,并访问出栈节点的右孩子.对栈中每个节点都做次操作.如果右子节点的左孩子不为空,继续进栈直到,左孩子为空.重复上述步骤.
//递归
public class Solution {
private List<Integer> traversal = new ArrayList<>();
private void traverse(TreeNode root) {
if (root == null) return;
if (root.left != null) traverse(root.left);
traversal.add(root.val);
if (root.right != null) traverse(root.right);
}
public List<Integer> inorderTraversal(TreeNode root) {
traverse(root);
return traversal;
}
}
//迭代
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
if (root == null) return result;
ArrayDeque<TreeNode> stack = new ArrayDeque<>();
do {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
result.add(root.val);
root = root.right;
} while (!stack.isEmpty() || root != null);
return result;
}
}