• 代码随想录Day12 二叉树 LeetCode T102二叉树的层序遍历 T226 翻转二叉树 T101 对称二叉树


    本文思路和详细讲解来自于:代码随想录 (programmercarl.com)

    LeetCode T102 二叉树的层序遍历

    题目链接:102. 二叉树的层序遍历 - 力扣(LeetCode)

    题目思路:

    本题使用队列辅助完成,讲解主要函数CheckOrder:首先判断root是否为空,是就直接返回,然后创建队列,向里加入root元素,计算队列的长度,也就是每一层的元素个数,while循环,size--为结束条件,每层的数组用tmp记录一下,循环内用临时node记录一下root的val,并将root移出队列,判断左右子树是否为空,不是就入队,出循环之后将数组加入二维数组.

    题目代码:

    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode() {}
    8. * TreeNode(int val) { this.val = val; }
    9. * TreeNode(int val, TreeNode left, TreeNode right) {
    10. * this.val = val;
    11. * this.left = left;
    12. * this.right = right;
    13. * }
    14. * }
    15. */
    16. class Solution {
    17. List> result = new ArrayList<>();
    18. public List> levelOrder(TreeNode root) {
    19. CheckOrder(root);
    20. return result;
    21. }
    22. public void CheckOrder(TreeNode node)
    23. {
    24. if(node == null)
    25. {
    26. return;
    27. }
    28. Queue que = new LinkedList<>();
    29. que.offer(node);
    30. while(!que.isEmpty())
    31. {
    32. List tmp = new ArrayList<>();
    33. int size = que.size();
    34. while(size>0)
    35. {
    36. TreeNode tmpNode = que.poll();
    37. tmp.add(tmpNode.val);
    38. if(tmpNode.left != null)
    39. {
    40. que.offer(tmpNode.left);
    41. }
    42. if(tmpNode.right != null)
    43. {
    44. que.offer(tmpNode.right);
    45. }
    46. size--;
    47. }
    48. result.add(tmp);
    49. }
    50. }
    51. }

    LeetCode T226 翻转二叉树

    题目链接:226. 翻转二叉树 - 力扣(LeetCode)

    题目思路:

    我们来看一下递归三部曲:

    1.确定递归函数的参数和返回值

    参数就是要传入节点的指针,不需要其他参数了,通常此时定下来主要参数,如果在写递归的逻辑中发现还需要其他参数的时候,随时补充。

    TreeNode invertTree(TreeNode root)

    2.确定终止条件

    当前节点为空的时候,就返回

    1. if(root == null)
    2. {
    3. return root;
    4. }

    3.确定单层递归的逻辑

    因为是先前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。

    1. Swap(root);
    2. invertTree(root.left);
    3. invertTree(root.right);

    题目代码:

    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode() {}
    8. * TreeNode(int val) { this.val = val; }
    9. * TreeNode(int val, TreeNode left, TreeNode right) {
    10. * this.val = val;
    11. * this.left = left;
    12. * this.right = right;
    13. * }
    14. * }
    15. */
    16. class Solution {
    17. public TreeNode invertTree(TreeNode root) {
    18. if(root == null)
    19. {
    20. return root;
    21. }
    22. Swap(root);
    23. invertTree(root.left);
    24. invertTree(root.right);
    25. return root;
    26. }
    27. public void Swap(TreeNode root)
    28. {
    29. TreeNode tmp = root.left;
    30. root.left = root.right;
    31. root.right = tmp;
    32. }
    33. }

    LeetCode T101 对称二叉树

    题目链接:

    题目思路:

    我们用递归实现,首先我们要清楚比较的是左右节点而不是左右孩子,其实就是左右外侧和内侧分别作比较,无非就是一下几种情况,

    在分别处理内外侧,最后进行与操作即可

    为什么是后序遍历?

    本题遍历只能是“后序遍历”,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。

    正是因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。

    题目代码:

    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode() {}
    8. * TreeNode(int val) { this.val = val; }
    9. * TreeNode(int val, TreeNode left, TreeNode right) {
    10. * this.val = val;
    11. * this.left = left;
    12. * this.right = right;
    13. * }
    14. * }
    15. */
    16. class Solution {
    17. public boolean isSymmetric(TreeNode root) {
    18. return cmp(root.left,root.right);
    19. }
    20. boolean cmp(TreeNode left,TreeNode right)
    21. {
    22. if(left==null &&right != null)
    23. {
    24. return false;
    25. }
    26. else if(left != null && right == null)
    27. {
    28. return false;
    29. }
    30. else if(left == null && right == null)
    31. {
    32. return true;
    33. }
    34. else if(right.val !=left.val)
    35. {
    36. return false;
    37. }
    38. boolean outSide = cmp(left.left,right.right);
    39. boolean inSide = cmp(left.right,right.left);
    40. return outSide && inSide;
    41. }
    42. }

  • 相关阅读:
    linux笔记(2):vscode插件remote WSL远程使用交叉编译工具链(全志D1-H)
    GitLab 知识树(二):gitlab社区版安装
    8.【外部排序】基本概念和方法 + 优化:【败者树】{减少关键字对比次数}、【置换-选择 排序】{减少初始归并段数量}、【最佳归并树】{谁先合并更快}
    QToolButton 使用(很好用)
    码元和码点(字符串截取截取得是码元,汉字有一些偏僻字占据两个码元,字符的函数往往不是我们期待)
    大一学生想自学web安全
    访问 github 问题解决方法
    10-5 Skywalking基于nginx+jenkins服务的全链路数据收集
    谷歌真的“不作恶”?前员工起诉:它早已亲手打破座右铭
    JSP宅急送物流管理系统
  • 原文地址:https://blog.csdn.net/qiuqiushuibx/article/details/133598398