中序遍历(左子树->根节点->右子树)
方法一:
递归
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new LinkedList<>();
traversal(root, ans);
return ans;
}
private void traversal(TreeNode root, List<Integer> ans) {
if (root != null) {
if (root.left != null)
traversal(root.left, ans);
ans.add(root.val);
if (root.right != null)
traversal(root.right, ans);
}
}
方法二:
循环迭代,这里使用栈来模拟递归过程。
思路:
1.创建一个空栈s
2.用 cur
来跟踪根结点,cur
初始化为null
.
3 如果cur
不为空,则将它存进栈s
中,并且,将cur
沿着左子树下移,直到cur
为空。
4.如果栈不为空,令cur
指向栈顶元素的右子树,将栈顶元素弹出来,并且将这个弹出来的元素 存进链表。重复第三步
5.当栈为空,并且cur没有指向时,我们迭代结束
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new LinkedList<>();
Stack<TreeNode> s = new Stack<>();
TreeNode cur = root;
while (cur != null || !s.isEmpty()) {
while (cur != null) {
s.push(cur);
cur = cur.left;
}
if (!s.isEmpty()) {
cur = s.peek().right;
ans.add(s.pop().val);
}
}
return ans;
}