[关闭]
@x-power 2023-02-06T05:35:40.000000Z 字数 1710 阅读 181

树代码

未分类


完全二叉树

  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 bool布尔型
  19. */
  20. public boolean isCompleteTree (TreeNode root) {
  21. // write code here
  22. Queue<TreeNode> queue = new LinkedList<>();
  23. queue.offer(root);
  24. boolean flag = false;
  25. while(!queue.isEmpty()){
  26. TreeNode node = queue.poll();
  27. // 有右孩子没有左孩子
  28. if(node.right != null && node.left == null) return false;
  29. // 遇到了左右孩子不双全的节点后,遇到了非叶子节点
  30. if(flag && (node.left != null || node.right != null)) return false;
  31. // 遇到左右孩子不双全的节点
  32. if((node.left != null && node.right == null) || (node.left == null && node.right == null)) flag = true;
  33. if(node.left != null) queue.offer(node.left);
  34. if(node.right != null) queue.offer(node.right);
  35. }
  36. return true;
  37. }
  38. }

前序中序重建二叉树

  1. //递归的思想是把一个大问题分成层层向下的小问题 每一层解决问题的方法都是一样的 我们考虑的就是本层的解决问题逻辑和结束条件
  2. //第一层 [1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]
  3. //第二层(1左子树) [2,4,7],[4,7,2] 每层解决问题的方法都是一样的
  4. //第三层(2左子树) [4,7],[4,7]
  5. //第三层(4右子树) [7],[7]
  6. //每层子树都是一样的解决方式
  7. //ps:先序+中序 中序+后序 都可以确定一棵树 先序+后序不行
  8. public class Solution {
  9. public TreeNode reConstructBinaryTree(int [] pre, int [] vin) {
  10. int m = pre.length;
  11. int n = vin.length;
  12. //中序遍历数组和先序遍历数组长度都不能为空
  13. if (m == 0 ||
  14. n == 0) { //换成&&也一样对 其实这道题里只要它中序遍历为0了 也就不可能有先序遍历的
  15. return null;
  16. }
  17. //计算器a a代表节点node的左子树有多少节点
  18. int a = 0;
  19. //这层子树的根节点必为先序遍历数组第一个位置的节点
  20. TreeNode treeNode = new TreeNode(pre[0]);
  21. for (int i = 0; i < vin.length; i++) {
  22. if (vin[i] != treeNode.val) {
  23. a++;
  24. } else {
  25. //node节点的左子树就是中序遍历node左边的那部分,同时把这左子树这部分的先序遍历数组传进去
  26. treeNode.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, 1 + a),
  27. Arrays.copyOfRange(vin, 0, a));
  28. //node节点的右子树就是中序遍历node右边的那部分,同时把这右子树这部分的先序遍历数组传进去
  29. treeNode.right = reConstructBinaryTree(Arrays.copyOfRange(pre, 1 + a,
  30. pre.length), Arrays.copyOfRange(vin, 1 + a, vin.length));
  31. }
  32. }
  33. //返回这层子树的根节点
  34. return treeNode;
  35. }
  36. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注