提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、前序遍历
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if (root == null) return res;
Deque<TreeNode> q = new LinkedList<TreeNode>();
while(root != null || !q.isEmpty()){
// 遍历到最左子节点
while(root != null){
res.add(root.val);
q.push(root);
root = root.left;
}
root = q.pop();
root = root.right;
}
return res;
}
二、中序遍历
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root == null) return res;
Deque<TreeNode> q = new LinkedList<>();
while(root != null || !q.isEmpty()){
while(root != null){
q.push(root);
root = root.left;
}
root = q.pop();
res.add(root.val);
root = root.right;
}
return res;
}
三、后续遍历
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root == null) return res;
Deque<TreeNode> q = new LinkedList<>();
TreeNode pre = null;
while(root != null || !q.isEmpty()){
// 1.遍历到最左子节点
while(root != null){
q.push(root);
root = root.left;
}
root = q.pop();
// 2.遍历最左子节点的右子树(右子树存在 && 未访问过)
if(root.right != null && pre != root.right){
q.push(root);
root = root.right;
}
else {
// 此时node的左右子树应均已完成访问
// 访问当前节点
res.add(root.val);
// 避免重复访问右节点
pre = root;
// 避免重复访问左节点
root = null;
}
}
return res;
}