Leetcode刷题100天—226. 翻转二叉树(二叉树)—day03

我会带着你远行 2022-09-02 11:39 254阅读 0赞

前言:

作者:神的孩子在歌唱
大家好,我叫运智

在这里插入图片描述

翻转一棵二叉树。

示例:

输入:

  1. 4
  2. / \
  3. 2 7
  4. / \ / \
  5. 1 3 6 9

输出:

  1. 4
  2. / \
  3. 7 2
  4. / \ / \
  5. 9 6 3 1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/invert-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码

此题有四种解法,前序,后序,中序,层序遍历,前三种用了递归方法实现的

  1. /* * 1 * https://leetcode-cn.com/problems/invert-binary-tree/ * 翻转一颗二叉树就是将其所有左右节点的左右子树都交换,也就是需要遍历所有节点,前序遍历 */
  2. public class TreeNode {
  3. int val;
  4. TreeNode left;
  5. TreeNode right;
  6. TreeNode(int val) { this.val = val; }
  7. }
  8. public class _226_翻转二叉树<E> {
  9. public TreeNode invertTree(TreeNode root) {
  10. // 前序遍历,先访问自己,在访问左右
  11. if (root==null) return root;
  12. // 先遍历头节点的子树
  13. TreeNode tmp=root.left;
  14. root.left=root.right;
  15. root.right=tmp;
  16. // 再用递归方法遍历左右子树,先遍历左或者右都没关系
  17. invertTree(root.left);
  18. invertTree(root.right);
  19. return root;
  20. }
  21. public TreeNode invertTree1(TreeNode root) {
  22. // 方法二:后序遍历,先访问左右,在访问自己
  23. if (root==null) return root;
  24. // 先用递归方法遍历左右子树,先遍历左或者右都没关系
  25. invertTree(root.left);
  26. invertTree(root.right);
  27. // 在将左右子树调换
  28. TreeNode tmp=root.left;
  29. root.left=root.right;
  30. root.right=tmp;
  31. return root;
  32. }
  33. public TreeNode invertTree2(TreeNode root) {
  34. // 方法三:中序遍历,先访问左,在自己(头节点),在右
  35. if (root==null) return root;
  36. // 先用递归方法遍历左子树
  37. invertTree(root.left);
  38. // 在将左右子树调换
  39. TreeNode tmp=root.left;
  40. root.left=root.right;
  41. root.right=tmp;
  42. // 这里注意不能写right,因为上边已经将左右子树调换了,right已经变成left了。
  43. invertTree(root.left);
  44. return root;
  45. }
  46. public TreeNode invertTree3(TreeNode root) {
  47. // 方法四:层序遍历,从上到下,从左到右一次访问每一个节点
  48. if (root==null) return root;
  49. // 创建队列,队列里面放节点TreeNode
  50. Queue<TreeNode> queue=new LinkedList<>();
  51. // 将根节点入队
  52. queue.offer(root);
  53. // 循环遍历,只要队列不为空,我就不断去除队列的头节点
  54. while(!queue.isEmpty()) {
  55. // 出队
  56. TreeNode node=queue.poll();
  57. // System.out.print(node.element);
  58. // 将队头里面的元素左右交换
  59. TreeNode tmp=node.left;
  60. node.left=node.right;
  61. node.right=tmp;
  62. // 如果发现左右节点有值就入队
  63. if(node.left!=null) {
  64. queue.offer(node.left);
  65. }
  66. if (node.right!=null) {
  67. queue.offer(node.right);
  68. }
  69. }
  70. return root;
  71. }
  72. }

本人csdn博客:https://blog.csdn.net/weixin\_46654114
转载说明:跟我说明,务必注明来源,附带本人博客连接。

发表评论

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

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

相关阅读

    相关 LeetCode226. 翻转

    今日份打卡力扣,这次用的是Java语言,之前都是用C/C++写的算法题,因为目前是从事Java开发方向,一会用C/C++,一会用Java,容易混淆,而且自己C++学的也不好,所