二叉树的前中后序遍历

小咪咪 2024-04-03 10:05 92阅读 0赞

ced485cbb11e458d81a746890b32cf3f.gif

作者:渴望力量的土狗

博客主页:渴望力量的土狗的博客主页

专栏:手把手带你刷牛客

工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网

点击免费注册和我一起刷题吧

d28543928b544e3db18cf98151ce783f.png

目录

二叉树的前序遍历:

一、解题思路:递归

二、解题思路:迭代

二叉树的中序遍历 :

一、解题思路:递归

二、解题思路:迭代

二叉树的后序遍历 :

一、解题思路:递归

二、解题思路:迭代


二叉树的前序遍历:

二叉树的前序遍历的记忆法则是“根左右”,即先遍历根节点,再遍历左子树节点,再遍历右子树节点。

如图所示:3f6957d485721213ec35be97bbe89d42.png

其遍历结果为【A, B, D, E, C, F, G】

给你二叉树的根节点 root ,返回它节点值的 前序遍历。

数据范围:二叉树的节点数量满足1≤n≤100 ,二叉树节点的值满足1≤val≤100,树的各节点的值各不相同

示例 1:

f005cf2b0b2f4deaba740359028e77a4.png

  1. 输入:
  2. {1,#,2,3}
  3. 返回值:
  4. [1,2,3]

一、解题思路:递归

  1. public class Solution {
  2. List<Integer> list = new ArrayList<>();
  3. public int[] preorderTraversal (TreeNode root) {
  4. List<Integer> list = preOrder(root);
  5. int[] res = new int[list.size()];
  6. for (int i = 0; i < list.size(); i++) {
  7. res[i] = list.get(i);
  8. }
  9. return res;
  10. }
  11. List<Integer> preOrder(TreeNode node) {
  12. if (node == null) {
  13. return list;
  14. }
  15. list.add(node.val);
  16. preOrder(node.left);
  17. preOrder(node.right);
  18. return list;
  19. }
  20. }

二、解题思路:迭代

  1. import java.util.*;
  2. /*
  3. * public class TreeNode {
  4. * int val = 0;
  5. * TreeNode left = null;
  6. * TreeNode right = null;
  7. * public TreeNode(int val) {
  8. * this.val = val;
  9. * }
  10. * }
  11. */
  12. public class Solution {
  13. /**
  14. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
  15. *
  16. *
  17. * @param root TreeNode类
  18. * @return int整型一维数组
  19. */
  20. public int[] preorderTraversal (TreeNode root) {
  21. // 结果集合
  22. ArrayList<Integer> arr = new ArrayList();
  23. if(root == null) {
  24. return new int[0];
  25. }
  26. TreeNode current;
  27. // LinkedList 当作栈来使用
  28. LinkedList<TreeNode> list = new LinkedList<TreeNode>();
  29. list.addFirst(root);
  30. while(!list.isEmpty()) {
  31. current = list.removeFirst();
  32. arr.add(current.val);
  33. if(current.right != null) {
  34. list.addFirst(current.right);
  35. }
  36. if(current.left != null) {
  37. list.addFirst(current.left);
  38. }
  39. }
  40. // 循环赋值。
  41. int[] res = new int[arr.size()];
  42. for(int i = 0; i < arr.size(); i++) {
  43. res[i] = arr.get(i);
  44. }
  45. return res;
  46. }
  47. }

二叉树的中序遍历 :

中序遍历是 二叉树遍历 的一种,也叫做 中根遍历 、中序周游。 在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。

给定一个二叉树的根节点root,返回它的中序遍历结果。

数据范围:树上节点数满足10000≤n≤1000,树上每个节点的值满足 −1000≤val≤1000
进阶:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

示例1:

94518b5e352646f0ae081d7aecf13439.png

  1. 输入:
  2. {1,2,#,#,3}
  3. 返回值:
  4. [2,3,1]

一、解题思路:递归

  1. import java.util.*;
  2. public class Solution {
  3. public void inorder(List<Integer> list, TreeNode root){
  4. //遇到空节点则返回
  5. if(root == null)
  6. return;
  7. //先去左子树
  8. inorder(list, root.left);
  9. //再访问根节点
  10. list.add(root.val);
  11. //最后去右子树
  12. inorder(list, root.right);
  13. }
  14. public int[] inorderTraversal (TreeNode root) {
  15. //添加遍历结果的数组
  16. List<Integer> list = new ArrayList();
  17. //递归中序遍历
  18. inorder(list, root);
  19. //返回的结果
  20. int[] res = new int[list.size()];
  21. for(int i = 0; i < list.size(); i++)
  22. res[i] = list.get(i);
  23. return res;
  24. }
  25. }

二、解题思路:迭代

  1. import java.util.*;
  2. public class Solution {
  3. public int[] inorderTraversal (TreeNode root) {
  4. //添加遍历结果的数组
  5. List<Integer> list = new ArrayList();
  6. Stack<TreeNode> s = new Stack<TreeNode>();
  7. //空树返回空数组
  8. if(root == null)
  9. return new int[0];
  10. //当树节点不为空或栈中有节点时
  11. while(root != null || !s.isEmpty()){
  12. //每次找到最左节点
  13. while(root != null){
  14. s.push(root);
  15. root = root.left;
  16. }
  17. //访问该节点
  18. TreeNode node = s.pop();
  19. list.add(node.val);
  20. //进入右节点
  21. root = node.right;
  22. }
  23. //返回的结果
  24. int[] res = new int[list.size()];
  25. for(int i = 0; i < list.size(); i++)
  26. res[i] = list.get(i);
  27. return res;
  28. }
  29. }

二叉树的后序遍历 :

后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点

给定一个二叉树,返回他的后序遍历的序列。

后序遍历是值按照 左节点->右节点->根节点 的顺序的遍历。

数据范围:二叉树的节点数量满足 1≤n≤100 ,二叉树节点的值满足1≤val≤100 ,树的各节点的值各不相同

d10eadcc51874294bb711dca329bad55.png

  1. 输入:
  2. {1,#,2,3}
  3. 返回值:
  4. [3,2,1]

一、解题思路:递归

  1. import java.util.*;
  2. public class Solution {
  3. public void postorder(List<Integer> list, TreeNode root){
  4. //遇到空节点则返回
  5. if(root == null)
  6. return;
  7. //先去左子树
  8. postorder(list, root.left);
  9. //再去右子树
  10. postorder(list, root.right);
  11. //最后访问根节点
  12. list.add(root.val);
  13. }
  14. public int[] postorderTraversal (TreeNode root) {
  15. //添加遍历结果的数组
  16. List<Integer> list = new ArrayList();
  17. //递归后序遍历
  18. postorder(list, root);
  19. //返回的结果
  20. int[] res = new int[list.size()];
  21. for(int i = 0; i < list.size(); i++)
  22. res[i] = list.get(i);
  23. return res;
  24. }
  25. }

二、解题思路:迭代

  1. import java.util.*;
  2. public class Solution {
  3. public int[] postorderTraversal (TreeNode root) {
  4. //添加遍历结果的数组
  5. List<Integer> list = new ArrayList();
  6. Stack<TreeNode> s = new Stack<TreeNode>();
  7. TreeNode pre = null;
  8. while(root != null || !s.isEmpty()){
  9. //每次先找到最左边的节点
  10. while(root != null){
  11. s.push(root);
  12. root = root.left;
  13. }
  14. //弹出栈顶
  15. TreeNode node = s.pop();
  16. //如果该元素的右边没有或是已经访问过
  17. if(node.right == null || node.right == pre){
  18. //访问中间的节点
  19. list.add(node.val);
  20. //且记录为访问过了
  21. pre = node;
  22. }else{
  23. //该节点入栈
  24. s.push(node);
  25. //先访问右边
  26. root = node.right;
  27. }
  28. }
  29. //返回的结果
  30. int[] res = new int[list.size()];
  31. for(int i = 0; i < list.size(); i++)
  32. res[i] = list.get(i);
  33. return res;
  34. }
  35. }

0adcbb015b104b77b0f11eb310cf5335.png

“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!

发表评论

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

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

相关阅读

    相关

    首先理解前中后序遍历。 他们是相对根节点的遍历前后来决定的; 也就是遍历顺序如果是前序遍历 : 就是按先遍历根节点,在遍历左节点,再遍历右节点; 从下面的二叉树体会一