当前位置:   article > 正文

剑指offerDayN树篇_treenode pre =null;与 treenode pre =new treenode()有

treenode pre =null;与 treenode pre =new treenode()有什么区别

根据前序中序递归重建二叉树

  1. package offer;
  2. import java.util.Arrays;
  3. import java.util.Stack;
  4. class TreeNode {
  5. int val;
  6. TreeNode left;
  7. TreeNode right;
  8. public TreeNode(int val) {
  9. this.val = val;
  10. }
  11. }
  12. /*
  13. 前序中序重建二叉树
  14. Arrays.copyOfRange()
  15. 主要用于对一个已有的数组进行截取复制,复制出一个左闭右开区间的数组。
  16. */
  17. public class Test31 {
  18. //递归调用构建树
  19. public static TreeNode reConstruct(int[] preOrder, int[] inOrder) {
  20. //先判空
  21. if (preOrder.length == 0 || preOrder == null) return null;
  22. //构建二叉树
  23. TreeNode root = new TreeNode(preOrder[0]);
  24. //查找根节点在中序之间的位置下标 每次左子树 跟右子树范围会发生变化
  25. int index = findIndex(preOrder, inOrder);
  26. //递归左子树
  27. //中序index其实就是他的长度
  28. root.left = reConstruct(Arrays.copyOfRange(preOrder, 1, index + 1), Arrays.copyOfRange(inOrder, 0, index));
  29. //递归右子树
  30. root.right = reConstruct(Arrays.copyOfRange(preOrder, index + 1, preOrder.length), Arrays.copyOfRange(inOrder, index + 1, inOrder.length));
  31. return root;
  32. }
  33. /**
  34. * 根据前序中序查找每次的根节点对应的下标
  35. *
  36. * @param preOrder
  37. * @param inOrder
  38. * @return
  39. */
  40. public static int findIndex(int[] preOrder, int[] inOrder) {
  41. //每次的根节点都是在变化的
  42. int root = preOrder[0];
  43. for (int i = 0; i < preOrder.length; i++) {
  44. if (inOrder[i] == root)
  45. return i;
  46. }
  47. return -1;
  48. }
  49. //二叉树前序遍历 非递归
  50. /**
  51. * 用栈实现非递归
  52. *
  53. * @param root
  54. */
  55. public static void preOrder(TreeNode root) {
  56. //先判空
  57. if (root == null)
  58. return;
  59. Stack<TreeNode> stack = new Stack<>();
  60. stack.push(root);
  61. while (!stack.isEmpty()) {
  62. TreeNode node = stack.pop();
  63. System.out.print(node.val+" ");
  64. if (node.right != null)
  65. stack.push(node.right);
  66. if (node.left != null)
  67. stack.push(node.left);
  68. }
  69. }
  70. public static void main(String[] args) {
  71. int[] preOrder = new int[]{1, 2, 4, 7, 3, 5, 6, 8};
  72. int[] inOrder = new int[]{4, 7, 2, 1, 5, 3, 8, 6};
  73. TreeNode tree = reConstruct(preOrder, inOrder);
  74. preOrder(tree);
  75. }
  76. }

层序遍历+按照节点位置输出层序遍历

树递归专栏:1树的镜像 2树的高度  3是否为平衡二叉树

  1. package offer;
  2. import java.util.ArrayList;
  3. import java.util.LinkedList;
  4. import java.util.List;
  5. import java.util.Queue;
  6. /*
  7. 1从上到下层序遍历树
  8. 2按照节点个数遍历树
  9. 3 二叉树镜像 对二叉树进轴对称
  10. 先对左右子树镜像
  11. 再对子树里面的数值进行求镜像
  12. 4求树的深度---递归经典套路
  13. 5判断树是不是平衡二叉树
  14. */
  15. public class Test32 {
  16. public static void bfsOrder(TreeNode root) {
  17. //判空
  18. if (root == null) return;
  19. Queue<TreeNode> queue = new LinkedList<>();
  20. queue.add(root);
  21. while (!queue.isEmpty()) {
  22. TreeNode node = queue.poll();
  23. System.out.print(node.val + " ");
  24. if (node.left != null)
  25. queue.add(node.left);
  26. if (node.right != null)
  27. queue.add(node.right);
  28. }
  29. }
  30. /**
  31. * 按照每行有多少节点返回
  32. *
  33. * @param root
  34. */
  35. public static List<List<Integer>> bfsOrder2(TreeNode root) {
  36. //判空
  37. if (root == null) return null;
  38. List<List<Integer>> lists = new ArrayList<>();
  39. Queue<TreeNode> queue = new LinkedList<>();
  40. queue.add(root);
  41. while (!queue.isEmpty()) {
  42. int size = queue.size();
  43. //每次新建一个列表
  44. List<Integer> temp = new ArrayList<>();
  45. while (size-- > 0) {
  46. TreeNode node = queue.poll();
  47. temp.add(node.val);
  48. if (node.left != null)
  49. queue.add(node.left);
  50. if (node.right != null)
  51. queue.add(node.right);
  52. }
  53. lists.add(temp);
  54. }
  55. return lists;
  56. }
  57. /**
  58. * 递归
  59. * 先对左右子树镜像
  60. * 再对子树里面的数值进行求镜像
  61. *
  62. * @param root
  63. * @return
  64. */
  65. public static TreeNode mirrorTree(TreeNode root) {
  66. if (root == null) return null;
  67. //递归翻转子节点
  68. //定义零时变量 右边放到左边 然后再把左边放到右边
  69. TreeNode temp = root.left;
  70. root.left = mirrorTree(root.right);
  71. root.right = mirrorTree(temp);
  72. return root;
  73. /*
  74. 写的复杂点
  75. 获得翻转子树
  76. TreeNode l = mirrorTree(root.left);
  77. TreeNode r = mirrorTree(root.right);
  78. 子树互换
  79. root.left = l;
  80. root.right = r;
  81. return root;
  82. */
  83. }
  84. /**
  85. * 递归求二叉树的高度
  86. * 返回左右子树的高度加1
  87. *
  88. * @param root
  89. * @return
  90. */
  91. public static int maxDepth(TreeNode root) {
  92. if (root == null) return 0;
  93. int l = maxDepth(root.left);
  94. int r = maxDepth(root.right);
  95. return l > r ? l + 1 : r + 1;
  96. }
  97. //平衡二叉树 任意节点的左右子树的高度不相差1 就是平衡二叉树
  98. /**
  99. * r任意节点
  100. * 高度相差1
  101. *
  102. * @param root
  103. * @return
  104. */
  105. public static boolean isBinarayTree(TreeNode root) {
  106. if (root == null) return true;
  107. //先求根节点左右两边子树的的深度差
  108. int l = maxDepth(root.left);
  109. int r = maxDepth(root.right);
  110. //|l-1|<=1
  111. //并且递归左右子树差都不能大于1
  112. return l - r >= -1 && l - r <= 1 && isBinarayTree(root.left) && isBinarayTree(root.right);
  113. }
  114. public static void main(String[] args) {
  115. //构建一颗树
  116. TreeNode node6 = new TreeNode(6, null, null);
  117. TreeNode node5 = new TreeNode(5, null, null);
  118. TreeNode node4 = new TreeNode(4, null, null);
  119. TreeNode node3 = new TreeNode(3, node6, null);
  120. TreeNode node2 = new TreeNode(2, node4, node5);
  121. TreeNode node1 = new TreeNode(1, node2, node3);
  122. bfsOrder(node1);
  123. System.out.println(bfsOrder2(node1));
  124. System.out.println();
  125. mirrorTree(node1);
  126. System.out.println(bfsOrder2(node1));
  127. System.out.println(maxDepth(node1));
  128. System.out.println(isBinarayTree(node1));
  129. }
  130. }

三种层序遍历的方式

  1. package offer;
  2. import java.util.LinkedList;
  3. import java.util.List;
  4. import java.util.Queue;
  5. /*
  6. 二叉树的打印
  7. 从上到下打印二叉树
  8. 1从上到下层序遍历
  9. 2分层打印
  10. 3之子形打印 特点 用linkedlist 头部插入比arraylist快很多
  11. */
  12. public class Test33 {
  13. //基础的层序遍历bfs
  14. public static void bfsOrders(TreeNode root) {
  15. //判空
  16. if (root == null) return;
  17. Queue<TreeNode> queue = new LinkedList<>();
  18. queue.add(root);
  19. while (!queue.isEmpty()) {
  20. TreeNode node = queue.poll();
  21. System.out.print(node.val + " ");
  22. if (node.left != null)
  23. queue.add(node.left);
  24. if (node.right != null)
  25. queue.add(node.right);
  26. }
  27. }
  28. //按照每层的节点内容输出
  29. public static List<List<Integer>> bfsOrders2(TreeNode root) {
  30. //判空
  31. if (root == null) return null;
  32. Queue<TreeNode> queue = new LinkedList<>();
  33. List<List<Integer>> list = new LinkedList<>();
  34. queue.add(root);
  35. while (!queue.isEmpty()) {
  36. int size = queue.size();
  37. List<Integer> temp = new LinkedList<>();
  38. while (size-- > 0) {
  39. TreeNode node = queue.poll();
  40. temp.add(node.val);
  41. if (node.left != null)
  42. queue.add(node.left);
  43. if (node.right != null)
  44. queue.add(node.right);
  45. }
  46. list.add(temp);
  47. }
  48. return list;
  49. }
  50. //z形输出树的节点
  51. //奇数在队列后面添加 偶数在队里前面添加
  52. /**
  53. * 队列前面添加 queue.add(0,node.val)
  54. *添加flag指标 判断
  55. * @param root
  56. */
  57. public static List<List<Integer>> bfsOrders3(TreeNode root) {
  58. //判空
  59. if (root == null) return null;
  60. Queue<TreeNode> queue = new LinkedList<>();
  61. List<List<Integer>> list = new LinkedList<>();
  62. queue.add(root);
  63. //每次输出一层
  64. //设置标识flag flag为true则添加
  65. boolean flag = true;
  66. while (!queue.isEmpty()) {
  67. int size = queue.size();
  68. List<Integer> temp = new LinkedList<>();
  69. while (size-->0){
  70. TreeNode node = queue.poll();
  71. if (flag) temp.add(node.val);// 从左往右
  72. else temp.add(0, node.val);//奇数从右往左
  73. if (node.left != null)
  74. queue.add(node.left);
  75. if (node.right != null)
  76. queue.add(node.right);
  77. }
  78. flag = !flag;
  79. list.add(temp);
  80. }
  81. return list;
  82. }
  83. public static void main(String[] args) {
  84. TreeNode node6 = new TreeNode(6, null, null);
  85. TreeNode node5 = new TreeNode(5, null, null);
  86. TreeNode node4 = new TreeNode(4, null, null);
  87. TreeNode node3 = new TreeNode(3, node6, null);
  88. TreeNode node2 = new TreeNode(2, node4, node5);
  89. TreeNode node1 = new TreeNode(1, node2, node3);
  90. bfsOrders(node1);
  91. System.out.println();
  92. System.out.println(bfsOrders2(node1));
  93. System.out.println(bfsOrders3(node1));
  94. }
  95. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/596047
推荐阅读
相关标签
  

闽ICP备14008679号