• 二叉树的练习题


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

    输入:{1,#,2,3}

    返回值:[1,2,3]

    思路1:二叉树的递归,则是将某个节点的左子树、右子树看成一颗完整的树,那么对于子树的访问或者操作就是对于原树的访问或者操作的子问题,因此可以自我调用函数不断进入子树。

    • 终止条件: 当子问题到达叶子节点后,后一个不管左右都是空,因此遇到空节点就返回。
    • 返回值: 每次处理完子问题后,就是将子问题访问过的元素返回,依次存入了数组中。
    • 子问题: 每个子问题优先访问这棵子树的根节点,然后递归进入左子树和右子树。

    思路2:使用辅助栈来存放每次遍历的根节点,弹出栈顶元素,然后判断该元素是否有左右子节点,有的话的加入栈中,优先加入右节点。同样也要先判断树是否为空,空树不遍历。

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. import java.util.Stack;
    4. public class Main {
    5. /**
    6. * 递归方法
    7. * @param root
    8. * @return
    9. */
    10. public int[] preorderTraversal(TreeNode root) {
    11. // write code here
    12. // 添加遍历结果的数组
    13. List list = new ArrayList();
    14. preOrder(list, root);
    15. int[] result = new int[list.size()];
    16. for (int i = 0; i < list.size(); i++) {
    17. result[i] = list.get(i);
    18. }
    19. return result;
    20. }
    21. public void preOrder(List list, TreeNode root) {
    22. if (root == null) {
    23. return;
    24. }
    25. list.add(root.val);
    26. preOrder(list, root.left);
    27. preOrder(list, root.right);
    28. }
    29. /**
    30. * 迭代方法
    31. * @param root
    32. * @return
    33. */
    34. public int[] preorderTraversal2 (TreeNode root) {
    35. // write code here
    36. // 判空
    37. if(root == null) {
    38. return new int[0];
    39. }
    40. // 存放树节点的集合
    41. List list = new ArrayList();
    42. // 辅助栈
    43. Stack stack = new Stack<>();
    44. stack.push(root);
    45. while(!stack.isEmpty()) {
    46. TreeNode node = stack.pop();
    47. list.add(node.val);
    48. // 先右树再左树,因为栈是先进先出的
    49. if(node.right != null) {
    50. stack.push(node.right);
    51. }
    52. if(node.left != null) {
    53. stack.push(node.left);
    54. }
    55. }
    56. // 结果集
    57. int[] result = new int[list.size()];
    58. for(int i = 0; i < list.size(); i++) {
    59. result[i] = list.get(i);
    60. }
    61. return result;
    62. }
    63. }


    2. 二叉树的中序遍历

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

    输入:{1,2,#,#,3}

    返回值:[2,3,1]

    1. import java.util.*;
    2. public class Main {
    3. /**
    4. * 迭代方法
    5. * @param root
    6. * @return
    7. */
    8. public int[] inorderTraversal(TreeNode root) {
    9. // write code here
    10. List list = new ArrayList();
    11. inOrder(root, list);
    12. int[] result = new int[list.size()];
    13. for (int i = 0; i < list.size(); i++) {
    14. result[i] = list.get(i);
    15. }
    16. return result;
    17. }
    18. public void inOrder(TreeNode root, List list) {
    19. if (root == null) {
    20. return;
    21. }
    22. inOrder(root.left, list);
    23. list.add(root.val);
    24. inOrder(root.right, list);
    25. }
    26. /**
    27. * 递归方法
    28. * @param root
    29. * @return
    30. */
    31. public int[] inorderTraversal2 (TreeNode root) {
    32. // write code here
    33. List list = new LinkedList<>();
    34. if (root == null) {
    35. return new int[0];
    36. }
    37. Stack stack = new Stack<>();
    38. while (root != null || !stack.isEmpty()) {
    39. while(root != null) {
    40. stack.push(root);
    41. root = root.left;
    42. }
    43. TreeNode node = stack.pop();
    44. list.add(node.val);
    45. root = node.right;
    46. }
    47. int[] res = new int[list.size()];
    48. for(int i = 0; i < list.size(); i++) {
    49. res[i] = list.get(i);
    50. }
    51. return res;
    52. }
    53. }

    3. 二叉树的后序遍历

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

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

    1. import java.util.*;
    2. public class Main {
    3. /**
    4. * 递归
    5. * @param root
    6. * @return
    7. */
    8. public int[] postorderTraversal (TreeNode root) {
    9. // write code here
    10. List list = new ArrayList();
    11. postOrder(list, root);
    12. int[] result = new int[list.size()];
    13. for(int i = 0; i < list.size(); i++) {
    14. result[i] = list.get(i);
    15. }
    16. return result;
    17. }
    18. public void postOrder(List list, TreeNode root) {
    19. if(root == null) {
    20. return;
    21. }
    22. postOrder(list, root.left);
    23. postOrder(list, root.right);
    24. list.add(root.val);
    25. }
    26. /**
    27. * 迭代
    28. * @param root
    29. * @return
    30. */
    31. public int[] postorderTraversal2 (TreeNode root) {
    32. // write code here
    33. List list = new LinkedList<>();
    34. if(root == null) {
    35. return new int[0];
    36. }
    37. Stack stack = new Stack<>();
    38. TreeNode pre = null;
    39. while (root != null || !stack.isEmpty()) {
    40. while (root != null) {
    41. stack.push(root);
    42. root = root.left;
    43. }
    44. // 弹出栈顶
    45. TreeNode node = stack.pop();
    46. if (node.right == null || node.right == pre) {
    47. list.add(node.val);
    48. pre = node;
    49. } else {
    50. stack.push(node);
    51. root = node.right;
    52. }
    53. }
    54. int[] res = new int[list.size()];
    55. for(int i = 0; i < list.size(); i++) {
    56. res[i] = list.get(i);
    57. }
    58. return res;
    59. }
    60. }


    ​​​​​​​

    给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
    例如:
    给定的二叉树是{3,9,20,#,#,15,7},
    该二叉树层序遍历的结果是
    [[3],[9,20],[15,7]]

    1. public class Solution {
    2. public ArrayList> levelOrder (TreeNode root) {
    3. // write code here
    4. ArrayList> list = new ArrayList();
    5. if(root == null) {
    6. return list;
    7. }
    8. // 队列存储
    9. Queue queue = new LinkedList<>();
    10. // 先进头节点放入队列中
    11. queue.add(root);
    12. while(!queue.isEmpty()) {
    13. // 记录二叉树的某一行
    14. ArrayList level = new ArrayList();
    15. int size = queue.size();
    16. // 每层节点多少,队列大小就是多大
    17. for(int i = 0; i < size; i++) {
    18. TreeNode cur = queue.poll();
    19. // 将出队的节点加入行中
    20. level.add(cur.val);
    21. if(cur.left != null) {
    22. // 若左孩子存在,将存入左孩子的左右孩子作为下一层
    23. queue.offer(cur.left);
    24. }
    25. if(cur.right != null) {
    26. // 若右孩子存在,将存入右孩子的左右孩子作为下一层
    27. queue.offer(cur.right);
    28. }
    29. }
    30. // 每一层加入结果集中
    31. list.add(level);
    32. }
    33. return list;
    34. }
    35. }

    活动地址:CSDN21天学习挑战赛

  • 相关阅读:
    【Python21天学习挑战赛】-爬虫(B站)程序示例
    状态压缩dp,91. 最短Hamilton路径
    8中间件-Redis、MQ---基本
    【云原生之kubernetes实战】在k8s环境下安装Taskover任务管理工具
    MySQL-事务的概念
    playwright自动化上传附件
    制作一个简单HTML抗疫逆行者网页作业(HTML+CSS)
    c++中多态调用场景下基类析构函数的virtual声明
    【K8S系列】深入解析k8s 网络插件—Antrea
    开发微信支付服务复盘
  • 原文地址:https://blog.csdn.net/AlinaQ05/article/details/126310527