题目链接
思路:
二叉树的前中后序遍历都可以使用递归来解决。不使用递归时,前序和中序容易实现,后序会困难一点。
使用递归解决中序遍历如下:
// 准备一个List来存放结果
private List<Integer> ans = new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
if (root == null) {
return ans;
}
inorder(root);
return ans;
}
private void inorder(TreeNode root) {
if (root == null) {
return;
}
// 处理左子树
inorder(root.left);
// 当前节点加入List中
ans.add(root.val);
// 处理右子树
inorder(root.right);
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
不使用递归如下:
由于中序遍历是“左中右”顺序,遍历时需要记录每一个“中”,这样才能确保找到“右”,否则会导致结果丢失。准备一个栈来保存遍历过程中的“中”
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) {
return res;
}
Deque<TreeNode> stack = new LinkedList<>();
TreeNode cur = root;
while (!stack.isEmpty() || cur != null) {
// 当前节点不为空,压入栈中,转向它的左子树
if (cur != null) {
stack.push(cur);
cur = cur.left;
} else { // 当前节点为空,说明此时左子树走到头了
cur = stack.pop(); // 栈顶节点为当前最左节点
res.add(cur.val); // 将此节点添加进结果中
cur = cur.right; // 转向右子树
}
}
return res;
}