二叉树的前、中、后序遍历和层序遍历的实现(递归 + 迭代)

女爷i 2023-09-28 23:17 19阅读 0赞

该篇文章写了二叉树的四种遍历方式,分别对应力扣上的题目为144. 二叉树的前序遍历、94. 二叉树的中序遍历、145. 二叉树的后序遍历、102. 二叉树的层序遍历。

二叉树结点定义:
  1. public class TreeNode {
  2. int val;
  3. TreeNode left;
  4. TreeNode right;
  5. public TreeNode() {
  6. }
  7. public TreeNode(int val) {
  8. this.val = val;
  9. }
  10. public TreeNode(int val, TreeNode left, TreeNode right) {
  11. this.val = val;
  12. this.left = left;
  13. this.right = right;
  14. }
  15. }
二叉树的递归遍历:

前序遍历:

  1. public void Preorder(List<Integer> list, TreeNode root) {
  2. if (root == null) {
  3. return;
  4. }
  5. //中-左-右
  6. list.add(root.val);
  7. Preorder(list, root.left);
  8. Preorder(list, root.right);
  9. }

中序遍历:

  1. public void MesoOrder(List<Integer> list, TreeNode root) {
  2. if (root == null) {
  3. return;
  4. }
  5. //左-中-右
  6. MesoOrder(list, root.left);
  7. list.add(root.val);
  8. MesoOrder(list, root.right);
  9. }

后序遍历:

  1. public void Postorder(List<Integer> list, TreeNode root) {
  2. if (root == null) {
  3. return;
  4. }
  5. //左-右-中
  6. Postorder(list, root.left);
  7. Postorder(list, root.right);
  8. list.add(root.val);
  9. }

层序遍历:

  1. public void Sequence(List<List<Integer>> list, TreeNode root, int deep) {
  2. if (root == null) {
  3. return;
  4. }
  5. if (list.size() == deep) {
  6. list.add(new ArrayList<>());
  7. }
  8. list.get(deep).add(root.val);
  9. Sequence(list, root.left, deep + 1);
  10. Sequence(list, root.right, deep + 1);
  11. }
二叉树的迭代遍历:

前序遍历:

  1. public List<Integer> preorderTraversal(TreeNode root) {
  2. List<Integer> res = new ArrayList<>();
  3. Deque<TreeNode> stack = new ArrayDeque<>();
  4. if (root != null) {
  5. stack.push(root);
  6. }
  7. while (!stack.isEmpty()) {
  8. TreeNode cur = stack.pop();
  9. res.add(cur.val);
  10. if (cur.right != null) {
  11. stack.push(cur.right);
  12. }
  13. if (cur.left != null) {
  14. stack.push(cur.left);
  15. }
  16. }
  17. return res;
  18. }

中序遍历:

  1. public List<Integer> inorderTraversal(TreeNode root) {
  2. List<Integer> res = new ArrayList<>();
  3. Deque<TreeNode> stack = new ArrayDeque<>();
  4. TreeNode cur = root;
  5. while (cur != null || !stack.isEmpty()) {
  6. if (cur != null) {
  7. stack.push(cur);
  8. cur = cur.left;
  9. } else {
  10. cur = stack.pop();
  11. res.add(cur.val);
  12. cur = cur.right;
  13. }
  14. }
  15. return res;
  16. }

后续遍历:

  1. public List<Integer> postorderTraversal(TreeNode root) {
  2. List<Integer> res = new ArrayList<>();
  3. Deque<TreeNode> stack = new ArrayDeque<>();
  4. if (root != null) {
  5. stack.push(root);
  6. }
  7. while (!stack.isEmpty()) {
  8. TreeNode cur = stack.pop();
  9. res.add(cur.val);
  10. if (cur.left != null) {
  11. stack.push(cur.left);
  12. }
  13. if (cur.right != null) {
  14. stack.push(cur.right);
  15. }
  16. }
  17. Collections.reverse(res);
  18. return res;
  19. }

层序遍历:

  1. public List<List<Integer>> levelOrder(TreeNode root) {
  2. List<List<Integer>> res = new ArrayList<>();
  3. Deque<TreeNode> stack = new ArrayDeque<>();
  4. if (root != null) {
  5. stack.offer(root);
  6. }
  7. while (!stack.isEmpty()) {
  8. int size = stack.size();
  9. List<Integer> list = new ArrayList<>();
  10. while (size-- != 0) {
  11. TreeNode node = stack.poll();
  12. list.add(node.val);
  13. if (node.left != null) {
  14. stack.offer(node.left);
  15. }
  16. if (node.right != null) {
  17. stack.offer(node.right);
  18. }
  19. }
  20. res.add(list);
  21. }
  22. return res;
  23. }

发表评论

表情:
评论列表 (有 0 条评论,19人围观)

还没有评论,来说两句吧...

相关阅读