给定一个二叉树,返回它的中序 遍历。
示例:
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode current = root;
while (current != null || !stack.isEmpty()) {
while (current != null) {
stack.push(current);
current = current.left;
}
current = stack.pop();
list.add(current.val);
current = current.right;
}
return list;
}
// 莫里斯遍历
public List<Integer> inorderTraversal_2(TreeNode root) {
TreeNode current = root;
List<Integer> ans = new LinkedList<>();
while (current != null) {
if (current.left == null) {
ans.add(current.val);
current = current.right;
continue;
}
TreeNode bottomRight = findBottomRight(current.left);
bottomRight.right = current;
TreeNode temp = current;
current = current.left;
temp.left = null;
}
return ans;
}
private TreeNode findBottomRight(TreeNode root) {
TreeNode ans = root;
while (ans.right != null) {
ans = ans.right;
}
return ans;
}