二叉树结构

  1. class TreeNode {
  2. int val = 0;
  3. TreeNode left = null;
  4. TreeNode right = null;
  5. public TreeNode(int val) {
  6. this.val = val;
  7. }
  8. }

题目描述

  • 输入两颗二叉树A,B,判断B是不是A的子结构

解析

  • 二叉树遍历算法的应用
  • 原二叉树是否具有某棵子树,只需要判断每个结点是否都在二叉树中出现即可
  • 第一步在树A中找到和B的根结点的值一样的结点R
  • 第二步再判断树A中以R为根结点的子树是不是包含和树B一样的结构

递归实现

  1. //判断根结点为root1的树是否包含root2结构
  2. public boolean hasSubtree(TreeNode root1,TreeNode root2) {
  3. //初始化标记变量为false
  4. boolean hasSubtreeFlag = false;
  5. //先判断根结点,若不包含判断左孩子,其次是右孩子
  6. if(root1 != null && root2 != null){
  7. if(root1.val == root2.val){
  8. hasSubtreeFlag = nodesValEqual(root1,root2);
  9. }
  10. if(!hasSubtreeFlag){
  11. hasSubtreeFlag = hasSubtree(root1.left,root2);
  12. }
  13. if(!hasSubtreeFlag){
  14. hasSubtreeFlag = hasSubtree(root1.right,root2);
  15. }
  16. }
  17. return hasSubtreeFlag;
  18. }
  19. //判断以root1为根的树上各结点值是否与root2相等
  20. public boolean nodesValEqual(TreeNode root1, TreeNode root2) {
  21. if(root2 == null){
  22. return true;
  23. }
  24. if(root1 == null){
  25. return false;
  26. }
  27. if(root1.val != root2.val){
  28. return false;
  29. }
  30. return nodesValEqual(root1.left,root2.left) && nodesValEqual(root1.right,root2.right);
  31. }
  32. <p></p>